在两个List <selectlistitem> </selectlistitem>上执行正确的并集

时间:2011-02-25 18:33:16

标签: c# .net list union selectlistitem

retval.AddRange(oldList.Union(newList));

此处oldListnewList均已声明

List<SelectListItem> oldList = new List<SelectListItem>();
List<SelectListItem> newList = new List<SelectListItem>();

我想将这两个列表联合起来,删除具有相同“text”属性的重复项。如果text属性上的newList和oldList之间存在欺骗,它应该保留newList的文本/值对。

上述联盟似乎没有做任何事情,除了几乎连续列表,不知道为什么。

我做错了什么?

2 个答案:

答案 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)

通过阅读documentationA.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}}