6

ListofがListありStrings、 Function を使用してアイテムのセットを追加する必要がありますがAddRange()、アイテムを複製することはありません。

次のコードを使用しました:

List<List<string>> eList = new List<List<string>>();
List<List<string>> mergedList = new List<List<string>>(); 

//
// some code here
//

mergedList.AddRange(eList.Where(x => !mergedList.Contains(x)).ToList());

しかし、それは機能しません。

重複したアイテムがすべて追加されたので、どうすれば解決できますか?

4

2 に答える 2

9

A)

重複とは、両方のリストに同じ要素が同じ順序で含まれていることを意味する場合、

List<List<string>> eList = new List<List<string>>();
eList.Add(new List<string>() { "a", "b" });
eList.Add(new List<string>() { "a", "c" });
eList.Add(new List<string>() { "a", "b" });


var mergedList = eList.Distinct(new ListComparer()).ToList();

public class ListComparer : IEqualityComparer<List<string>>
{
    public bool Equals(List<string> x, List<string> y)
    {
        return x.SequenceEqual(y);
    }

    public int GetHashCode(List<string> obj)
    {
        return obj.Take(5).Aggregate(23,(sum,s)=> sum ^= s.GetHashCode());
    }
}

B)

リスト内の要素の順序が重要でない場合は、

List<List<string>> eList = new List<List<string>>();
eList.Add(new List<string>() { "a", "b" }); <--
eList.Add(new List<string>() { "a", "c" });
eList.Add(new List<string>() { "b", "a" }); <--

var mergedList = eList.Select(x => new HashSet<string>(x))
                      .Distinct(HashSet<string>.CreateSetComparer()).ToList();
于 2013-01-12T20:56:17.777 に答える
2

次のLINQクエリを試してください

mergeList.AddRange( eList.Where (x => mergeList.Where ( y => y.Intersect(x)).Any()));
于 2013-01-12T21:07:57.107 に答える