积极答复者
请教一个List<自定义类>交换位置的问题

问题
-
有如下自定义类
public class test
{
public string name { get; set; }
public string number { get; set; }
public test Clone()
{
return new test()
{
name = this.name,
number = this.number
};
}
public void Rep(test m)
{
this.name = m.name;
this.number = m.number;
}
}执行代码在这里
List<test> p = new List<test>();
p.Add(new test() { name = "天上人间", number = "1" });
p.Add(new test() { name = "海角天涯", number = "2" });
p.Add(new test() { name = "人民群众", number = "3" });
p.Add(new test() { name = "粗制滥造", number = "4" });
p.Add(new test() { name = "风风火火", number = "5" });
var a = p.FirstOrDefault(t => t.number == "2").Clone();
var b = p.FirstOrDefault(t => t.number == "3").Clone();
p.FirstOrDefault(t => t.number == "2").Rep(b);
p.FirstOrDefault(t => t.number == "3").Rep(a); //若注释此句,则显示内容是正常的,有两个"人民群众",但加上此句,就变得跟没执行过变更顺序一样了
p.Select((t, i) =>
{
Console.WriteLine(string.Format("{0}{1}", t.name, t.number));
return "";
}).Count();问题是这样的,我的目的是实现第二项与第三项互换位置,考虑到这是值类型,因此都用了new去生成,以确保不会调用同一个内存块,但为什么执行完后,就像没换过位置一样呢?
答案
-
N10Z;)
恐怕并不是string是引用类型的关系。String虽然是引用类型(本质是类),但是已经被经过了特殊处理(譬如运算符重载等)。因此真正原因在于:
p.FirstOrDefault(t => t.number == "2").Rep(b);:
执行以后变成了(注意粗、斜黑体部分)
p.Add(new test() { name = "天上人间", number = "1" });
p.Add(new test() { name = "人民群众", number = "3" });
p.Add(new test() { name = "人民群众", number = "3" });
p.Add(new test() { name = "粗制滥造", number = "4" });
p.Add(new test() { name = "风风火火", number = "5" });但是如果此时执行:p.FirstOrDefault(t => t.number == "3").Rep(a);
那么找到的是这个黑体的实体类,又改回了原来的样子。
【解决方案】p.LastOrDefault(t => t.number == "3").Rep(a); //改成这一句即可
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats
Found any spamming-senders? Please report at: Spam Report- 已标记为答案 Min ZhuModerator 2013年7月17日 8:30
全部回复
-
N10Z;)
恐怕并不是string是引用类型的关系。String虽然是引用类型(本质是类),但是已经被经过了特殊处理(譬如运算符重载等)。因此真正原因在于:
p.FirstOrDefault(t => t.number == "2").Rep(b);:
执行以后变成了(注意粗、斜黑体部分)
p.Add(new test() { name = "天上人间", number = "1" });
p.Add(new test() { name = "人民群众", number = "3" });
p.Add(new test() { name = "人民群众", number = "3" });
p.Add(new test() { name = "粗制滥造", number = "4" });
p.Add(new test() { name = "风风火火", number = "5" });但是如果此时执行:p.FirstOrDefault(t => t.number == "3").Rep(a);
那么找到的是这个黑体的实体类,又改回了原来的样子。
【解决方案】p.LastOrDefault(t => t.number == "3").Rep(a); //改成这一句即可
If you think one reply solves your problem, please mark it as An Answer, if you think someone's reply helps you, please mark it as a Proposed Answer
Help by clicking:
Click here to donate your rice to the poor
Click to Donate
Click to feed Dogs & Cats
Found any spamming-senders? Please report at: Spam Report- 已标记为答案 Min ZhuModerator 2013年7月17日 8:30