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

oldListとの両方newListがここで宣言されています

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

これらの2つのリストを結合して、同じ「text」プロパティを持つ重複アイテムを削除したいと思います。textプロパティのnewListとoldListの間に重複がある場合は、newListのtext/valueペアを保持する必要があります。

上記の組合は、リストをほとんど連結する以外に何もしていないようです。理由はわかりません。

私は何が間違っているのですか?

4

2 に答える 2

2

これらの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)));
于 2011-02-25T18:41:48.143 に答える
1

ドキュメントを読むと、実際には、まだに含まれていないアイテムがA.Union(B)追加されているように見えます。あれは:ABA

このメソッドによって返されるオブジェクトが列挙されると、Unionは1番目と2番目をこの順序で列挙し、まだ生成されていない各要素を生成します。

簡単なテストでそれが裏付けられます。したがって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 に答える