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

oldList和都newList在这里声明

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

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

上面的联合似乎除了连接列表几乎没有做任何事情,不知道为什么。

我究竟做错了什么?

4

2 回答 2

2

我想合并这两个列表,删除具有相同“文本”属性的重复项。

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)));
于 2011-02-25T18:41:48.143 回答
1

从阅读文档看来,A.Union(B)实际上只是添加了A那些B尚未在A. 那是:

当枚举此方法返回的对象时,Union 按顺序枚举 first 和 second 并产生每个尚未产生的元素。

快速测试证明了这一点。所以oldList.Union(newList)会保留旧值,而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);
        }
    }
于 2011-02-25T19:06:32.493 回答