10

1 つのリストに list2 の名前/値のいずれかが含まれている場合、true を返そうとしています。

これは私の構造になります:

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

List<TStockFilterAttributes> List1 = new List<TStockFilterAttributes>();
List<TStockFilterAttributes> List2 = new List<TStockFilterAttributes>();

これは true を返すはずです:

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

ただし、名前と値が一致しないため、これは false を返します。

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

各リストにはさまざまな値が含まれている可能性があり、List1 のいずれかが List2 のいずれかと一致するかどうかを知る必要があります。

私は使用してみました:

return List1.Intersect(List2).Any();

しかし、これはすべての場合に false を返すようです。これは、単純な int / string ではなく List でクラスを保持しているためだと思いますか?

4

5 に答える 5

8

クラスのオーバーライドEqualsGetHashCode実装:

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

    public override bool Equals(object obj)
    {
        TStockFilterAttributes other = obj as TStockFilterAttributes;
        if (obj == null)
            return false;

        return Name == obj.Name && Value == obj.Value;
    }

    public override int GetHashCode()
    {
        return Name.GetHashCode() ^ Value.GetHashCode();
    }
}

または、機能する比較ツールを提供しIntersectます。

于 2012-11-21T14:09:38.327 に答える
6

パフォーマンスは問題ではないと仮定します。

List1.Any(l1 => List2.Any(l2 => l1.Key == l2.Key && l1.Value == l2.Value));

代替手段は、Equals をオーバーライドするか、Struct にすることです (おそらく適切ではありません)。

于 2012-11-21T14:07:42.327 に答える
3
var query = List1.Where(x => List2.Exists(y => y.Name == x.Name && y.Value == x.Value));

でも性能は悪いかも

于 2012-11-21T14:14:49.617 に答える
1

ここでの問題は、オブジェクトではなく参照を比較していることです。毎回新しいオブジェクトを作成するため、リストが同じ参照を保持することはありません。

試す:

var FooBar = new TStockFilterAttributes { Name = "Foo", Value = "Bar" };
var FooFoo = new TStockFilterAttributes { Name = "Foo", Value = "Foo" };
List1.Add(FooBar);
List2.Add(FooBar);
List2.Add(FooFoo);
return List1.Intersect(List2);
于 2012-11-21T14:08:03.827 に答える
0

ぶつかるのが遅いですが、intersect を使用すると、select を使用して、equality の使用を避けることができます。

list1.Select(Function(p) p.ItemID).Intersect(list2.Select(Function(p)p.ItemID)).Any()
于 2015-12-22T16:13:36.560 に答える