retval.AddRange(oldList.Union(newList));
此处oldList
和newList
均已声明
List<SelectListItem> oldList = new List<SelectListItem>();
List<SelectListItem> newList = new List<SelectListItem>();
我想将这两个列表联合起来,删除具有相同“text”属性的重复项。如果text属性上的newList和oldList之间存在欺骗,它应该保留newList的文本/值对。
上述联盟似乎没有做任何事情,除了几乎连续列表,不知道为什么。
我做错了什么?
答案 0 :(得分:2)
我想结合这两个列表,删除具有相同“text”属性的重复项。
Union
方法无法处理此要求。你可以通过以下方式做到这一点:
retVal.AddRange(newList); // Since you want to keep all newList items, do this first
// Add in all oldList items where there isn't a match in new list
retVal.AddRange(oldList.Where(i => !newList.Any(n => i.Text == n.Text)));
答案 1 :(得分:1)
通过阅读documentation,A.Union(B)
生效A
只会将B
中尚未加入A
的{{1}}项添加到oldList.Union(newList)
。那就是:
当此对象返回时 方法被枚举,Union枚举 第一和第二顺序和 产生每个没有的元素 已经屈服了。
快速测试证实了这一点。因此newList.Union(oldList)
将保留旧值,而 class MyThing
{
public string Text { get; private set; }
public int Version { get; private set; }
public MyThing(string t, int v)
{
Text = t;
Version = v;
}
public override int GetHashCode()
{
return Text.GetHashCode();
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
MyThing other = obj as MyThing;
if (other == null)
return false;
return this.Text.Equals(other.Text);
}
}
static List<MyThing> oldList = new List<MyThing>()
{
new MyThing("Foo", 0),
new MyThing("Bar", 0),
new MyThing("Fooby", 0),
};
static List<MyThing> newList = new List<MyThing>()
{
new MyThing("Barby", 1),
new MyThing("Bar", 1)
};
static void DoIt()
{
var unionOldNew = oldList.Union(newList);
Console.WriteLine("oldList.Union(newList)");
foreach (var t in unionOldNew)
{
Console.WriteLine("{0}, {1}", t.Text, t.Version);
}
Console.WriteLine();
var unionNewOld = newList.Union(oldList);
Console.WriteLine("newList.Union(oldList)");
foreach (var t in unionNewOld)
{
Console.WriteLine("{0}, {1}", t.Text, t.Version);
}
}
将为您提供新值。
这是我的测试代码:
{{1}}