1

私はいくつかのデータを含む2つのリストを持っています:

List1.Add(new Filter { Name = "Foo", Value = "Bar" });
List2.Add(new Filter { Name = "Foo", Value = "Bar" });

上記の例は明らかにtrueを返しますが、これは例ですが、追加した場合、Linqを使用してtrueを返しますList1List2

List2.Add(new Filter { Name = "Foo1", Value = "Bar1" });

その後、false を返す必要があります。

私は次の行をたどり始めました:

var Result = from item1 in List1
             join item2 in List2 on item1.Name equals item2.Name
             new { item1, item2 };

しかし、これは名前でのみ一致し、これで間違ったルートをたどっていると確信しています。

編集: 明確にするために、私は VALUE プロパティだけは必要ありません。名前と値は両方のリストで一致する必要があります。

4

3 に答える 3

4

使用できますExcept

var l1Vals = List1.Select(f => f.Value);
var l2Vals = List2.Select(f => f.Value);
var notInL1 = l2Vals.Except(l1Vals);
if(notInL1.Any())
{
    // no, not all Values of List2 are in List1
}

編集のすべてのプロパティを比較する最後の編集によるとFilter、最善の方法は、カスタムを作成し、それをこのオーバーロードIEqualityComparer<Filter>の引数として使用することです。Enumerable.Except

public class Filter {
    public String Name { get; set; }
    public String Value { get; set; }

    public class Comparer : IEqualityComparer<Filter>
    {
        public bool Equals(Filter x, Filter y)
        {
           if(ReferenceEquals(x, y))
               return true;
           else if(x==null || y==null)
               return false;
           return x.Name  == y.Name
               && x.Value == y.Value;
        }

        public int GetHashCode(Filter obj)
        {
            unchecked 
            {
                int hash = 17;
                hash = hash * 23 + obj.Name.GetHashCode();
                hash = hash * 23 + obj.Value.GetHashCode();
                return hash;
            }
        }
    }
}

これで動作します:

var notInL1 = List2.Except(List1, new Filter.Comparer());
if (notInL1.Any())
{
    // no, not all properties of all objects in List2 are same in List1
    // notInL1 contains the set difference
}
于 2012-11-20T10:00:18.787 に答える
0

あなたが試すことができます:

bool areAllElementsInList2 = list1.All(i => list2.Contains(i));

Contains-Methode は Equals-Methode を使用して、項目がそのリストに含まれているかどうかを指定します。したがって、Filter-Class の Equals-Methode をオーバーライドする必要があります。

または、次のことを試してください。

bool areAllElementsInList2 = list1.All(i1 => list2.Any(i2 => i1.Name == i2.Name && i1.Value == i2.Value));

HTH トビ

于 2012-11-20T10:00:36.727 に答える
0
bool list1doesNotContainAllFromList2 = list2.Except(list1).Any();

セットを操作する必要がある場合 (比較など) は、標準の LINQ 演算子よりも高速に実行されるorのようなメソッドを使用するHashSet<>代わりに、コレクションを使用することをお勧めします。List<>ExceptWithUnionWith

于 2012-11-20T10:01:03.230 に答える