10

如果一个列表包含 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,因为 Name && Value 不匹配:

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

每个列表可能包含许多不同的值,我只需要知道 List1 中的任何一个是否与 List2 中的任何一个匹配。

我试过使用:

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

但这似乎在所有情况下都返回 false,我假设这是因为我在 List 中持有一个类而不是一个简单的 int / string?

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 并避免使用相等。

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