7

おそらく私は些細なことを見逃しています。いくつかの がList<T>あり、それらから 1 つの大きなリストが必要です。これは、他のすべてのリストの結合です。しかし、値/コピーだけでなく、その大きなリストにそれらの参照が必要です(SOで通常見られる多くの質問とは異なります)。

たとえば、私はこれを持っています、

List<string> list1 = new List<string> { "a", "b", "c" };
List<string> list2 = new List<string> { "1", "2", "3" };

var unionList = GetThatList(list1, list2);

で欲しいリストを取得するとすると、次のようになりunionListます。

unionList.Remove("a"); => list1.Remove("a");
unionList.Remove("1"); => list2.Remove("1");

//in other words
//
//unionList.Count = 4;
//list1.Count = 2;
//list2.Count = 2;

明確にするために、これは通常次の場合に発生します

unionList = list1; //got the reference copy.

list2しかし、2 番目のリストに追加するにはどうすればよいunionListでしょうか。

試しAddてみAddRangeましたが、明らかにコピーではなくクローンです。

unionList = list1;
unionList.AddRange(list2); //-- error, clones, not copies here.

foreach (var item in list2)
{
    unionList.Add(item); //-- error, clones, not copies here.
}

更新:私は意味をなさないこと、および言語では本質的に不可能なことを尋ねていると思います..

4

1 に答える 1

12

そのようなクラスは存在しないと思います。自分で実装できます。ここから始めましょう:

class CombinedLists<T> : IEnumerable<T> // Add more interfaces here.
                                        // Maybe IList<T>, but how should it work?
{
    private List<List<T>> lists = new List<List<T>>();

    public void AddList(List<T> list)
    {
        lists.Add(list);
    }

    public IEnumerator<T> GetEnumerator()
    {
        return lists.SelectMany(x => x).GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public bool Remove(T t)
    {
        foreach (List<T> list in lists)
        {
            if (list.Remove(t)) { return true; }
        }
        return false;
    }

    // Implement the other methods.
}

テストに使用できるコードを次に示します。

List<string> list1 = new List<string> { "a", "b", "c" };
List<string> list2 = new List<string> { "1", "2", "3" };
CombinedLists<string> c = new CombinedLists<string>();
c.AddList(list1);
c.AddList(list2);

c.Remove("a");
c.Remove("1");

foreach (var x in c) { Console.WriteLine(x); }
Console.WriteLine(list1.Count);
Console.WriteLine(list2.Count);

アイテムの削除はかなり簡単です。ただし、組み合わせたリストにアイテムを挿入しようとすると、問題が発生する可能性があります。どのリストが挿入された項目を受け取るべきかは、常に明確に定義されているわけではありません。たとえば、2 つの空のリストを含む結合リストがあり、インデックス 0 に項目を挿入する場合、項目は最初または 2 番目の空のリストに追加する必要がありますか?

于 2012-07-28T22:30:46.257 に答える