我有2个列表
var hashTags = new List<HashTag>();
hashTags.Add(new HashTag
{
Name = "#HashTag1",
Index = 1
});
hashTags.Add(new HashTag
{
Name = "#HashTag2",
Index = 2
});
hashTags.Add(new HashTag
{
Name = "#HashTag3",
Index = 3
});
hashTags.Add(new HashTag
{
Name = "#HashTag4",
Index = 4
});
var hashTags2 = new List<HashTag>();
hashTags2.Add(new HashTag
{
Name = "#HashTag1",
Index = 1
});
hashTags2.Add(new HashTag
{
Name = "#HashTag3",
Index = 3
});
hashTags2.Add(new HashTag
{
Name = "#HashTag4",
Index = 4
});
如何检查hashTags中是否存在hashTags2中的所有元素?可以忽略索引,只有名称匹配才是至关重要的。我可以写一个for循环来检查元素,但我正在寻找一个LINQ解决方案。
答案 0 :(得分:3)
由于只考虑名称的相等性,因此可以通过首先映射到名称然后按如下方式检查包含来解决问题。
var hashTags2Names = hashTags2.Select( iItem => iItem.Name );
var hashTagsNames = hashTags.Select( iItem => iItem.Name );
var Result = hashTags2Names.Except( hashTagsNames ).Any();
答案 1 :(得分:2)
答案 2 :(得分:2)
所以你想要一个boolean linq表达式,如果hashTags中的每个元素的名字都存在于hashTags中,那么它返回true?
为此您需要函数Enumerable.All,您希望hashTags2中的每个Hashtag ...
bool result = hashTags2.All(hashTag => ...)
你想在hashTags2中检查每个hashTag是什么?该名称是hashTags中的名称。所以我们需要hashTags的名称:
IEnumerable<string> names = hashTags.Select(hashTag => hashTag.Name);
并检查项目是否在序列中:Enumerable.Contains。
把它们放在一起:
IEnumerable<string> names = hashTags.Select(hashTag => hashTag.Name);
bool result = hashTags2.All(hashTag => names.Contains(hashTag.Name));
如果您想要一个相当难以理解的表达式:
bool result = hashTags2.All(hashTagX =>
hashTags.Select(hashTagY => hashTagY.Name)
.Contains(hashtagX)))
由于延迟执行,第一种和第二种方法之间没有区别。第一个将更具可读性。
答案 3 :(得分:1)
使用Linq到对象,您至少需要一个IEqualityComparar
告诉linq如何比较对象并确定它们何时相等。
一个简单的比较器将使用Name属性来确定HashTag
的相等性。
public class NameEquality : IEqualityComparer<HashTag>
{
public bool Equals(HashTag tag, HashTag tag2)
{
return tag.Name == tag2.Name;
}
public int GetHashCode(HashTag tag)
{
return tag.Name.GetHashCode();
}
}
使用此Equality Comparer,您可以使用linq方法Except()
来获取列表hashTag
中不属于hashTag2
的所有元素。
hashTags.Except(hashTags2, new NameEquality())
答案 4 :(得分:0)
我更喜欢连接运算符,但我想这只是一个品味问题:
var hashMatched = hashTags.Join(hashTags2,_o => _o.Name, _i => _i.Name, (_o,_i) => _o);