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

C# 列表中的Linq项存在于另一个列表中,c#,linq,C#,Linq,我有两张单子 清单1 var hashTags=new List(); 添加(新的标签) { Name=“#HashTag1”, 索引=1 }); 添加(新的标签) { Name=“#HashTag2”, 指数=2 }); 添加(新的标签) { Name=“#HashTag3”, 指数=3 }); 添加(新的标签) { Name=“#HashTag4”, 指数=4 }); 清单2 var hashTags2=new List(); hashTags2.Add(新的HashTag { Name=

我有两张单子

清单1
var hashTags=new List();
添加(新的标签)
{
Name=“#HashTag1”,
索引=1
});
添加(新的标签)
{
Name=“#HashTag2”,
指数=2
});
添加(新的标签)
{
Name=“#HashTag3”,
指数=3
});
添加(新的标签)
{
Name=“#HashTag4”,
指数=4
});
清单2
var hashTags2=new List();
hashTags2.Add(新的HashTag
{
Name=“#HashTag1”,
索引=1
});
hashTags2.Add(新的HashTag
{
Name=“#HashTag3”,
指数=3
});
hashTags2.Add(新的HashTag
{
Name=“#HashTag4”,
指数=4
});

如何检查hashTags2中的所有元素是否都存在于hashTags中?索引可以忽略,只有名称匹配才是关键。我可以编写for循环来检查元素,但我正在寻找LINQ解决方案。

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

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

简单的
linq
方法

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

工作

我更喜欢join操作符,但我想这只是一个品味问题:

var hashMatched = hashTags.Join(hashTags2,_o => _o.Name, _i => _i.Name, (_o,_i) => _o);

所以,如果hashTags2中的每个元素的名称都存在于hashTags中,那么您想要一个返回true的布尔linq表达式吗

为此,您需要函数,您需要hashTags2中的每个Hashtag

bool result = hashTags2.All(hashTag => ...)
对于hashTags2中的每个hashTag,您希望检查什么?该名称是hashTags中的名称。所以我们需要hashTags的名称:

IEnumerable<string> names = hashTags.Select(hashTag => hashTag.Name);

由于执行延迟,第一种方法和第二种方法之间没有区别。第一个将更具可读性。

使用Linq to对象,您将需要至少一个
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();
  }
}

您需要创建一个比较器,并使用LINQ
Except
方法检查是否存在所有元素。使用修改后的答案,我们甚至可以使用
Except
进行简化。我们不需要
全部
@HariPrasad谢谢你的建议,我改变了答案。
IEnumerable<string> names = hashTags.Select(hashTag => hashTag.Name);
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)))
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();
  }
}
hashTags.Except(hashTags2, new NameEquality())