我有2个列表,其中包含一些数据:
List1.Add(new Filter { Name = "Foo", Value = "Bar" });
List2.Add(new Filter { Name = "Foo", Value = "Bar" });
如果List1
包含List2
中的所有值,我想使用Linq返回true,上面的示例显然会返回true,但这是一个示例,但如果我添加了
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属性。名称&&两个列表中的值必须匹配。
答案 0 :(得分: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
overload:
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
}
答案 1 :(得分: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 Tobi
答案 2 :(得分:0)
bool list1doesNotContainAllFromList2 = list2.Except(list1).Any();
请注意,如果您需要使用集合 - 比较等,最好使用HashSet<>
集合而不是List<>
- 它有ExceptWith
或{{1}等方法这将比标准LINQ运算符执行得更快。