如果一个列表包含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中持有一个类?
答案 0 :(得分:8)
覆盖您班级的Equals
和GetHashCode
实施:
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));