列表中的Linq项目存在于另一个列表中

时间:2016-02-12 07:20:36

标签: c# linq

我有2个列表

清单1

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
});

清单2

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解决方案。

5 个答案:

答案 0 :(得分:3)

由于只考虑名称的相等性,因此可以通过首先映射到名称然后按如下方式检查包含来解决问题。

var hashTags2Names = hashTags2.Select( iItem => iItem.Name );
var hashTagsNames = hashTags.Select( iItem => iItem.Name );
var Result = hashTags2Names.Except( hashTagsNames ).Any();

答案 1 :(得分:2)

简单linq方法。

hashTags2.All(h=> hashTags.Any(h1 => h1.Name == h.Name))

工作Demo

答案 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);