检查一个列表是否包含其他列表中的任何元素

时间:2012-11-21 14:03:06

标签: c# linq

如果一个列表包含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&amp;&amp;值不匹配:

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中持有一个类?

5 个答案:

答案 0 :(得分: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函数提供比较器。

答案 1 :(得分:6)

假设表现无关紧要:

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

替代方法是覆盖Equals或使其成为Struct(可能不合适)

答案 2 :(得分:3)

var query = List1.Where(x => List2.Exists(y => y.Name == x.Name && y.Value == x.Value));

但表现可能不好

答案 3 :(得分: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);

答案 4 :(得分:0)

迟到但有了交叉,我们可以使用select并避免使用相等。

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));