C#LINQ-比较IEnumerable<;字符串>;对照一份匿名名单

本文关键字:一份 名单 IEnumerable 比较 lt 字符串 C#LINQ- gt | 更新日期: 2023-09-27 18:27:35

的基本问题

我有:

  • IEnumerable<string> listA
  • var listB(这是由LINQ查询生成的匿名列表)

我想查询包含listA的对象列表,看看它们是否与listB:匹配

someObjectList.Where(x => x.listA == listB)

比较不起作用——那么我如何确保两个列表的比较类型相同?

详细问题

我将一个较大的列表分组为一个子集,其中包含一个名称和相关日期。

var listGroup = from n in list group n by new
   { n.NAME  } into d
   select new
   {
      NAME = d.Key.NAME, listOfDates = from x in d select new
                                     { Date = x.DATE } };

我有一个保存值以供进一步处理的对象:

class SomeObject
{
    public SomeObject()
    {
        _listOfDates = new List<DateTime>();
    }
    private IEnumerable<DateTime> _listOfDates;
    public IEnumerable<DateTime> ListOfDates
    {
        get { return _listOfDates; }
        set { _listOfDates = value; }
    }
 }

然后,我在listGroup上迭代,并将其添加到SomeObject的通用List<>中:

foreach(var item in listGroup)
{
    SomeObject so = new SomeObject();
    // ...do some stuff
    if (some match occurs then add into List<SomeObject>)
}

当我迭代时,我想检查现有的List<SomeOjbect>是否匹配:

var record = someObjectList.Where(x => x.NAME == item.NAME && 
                                       x.ListOfDates == item.listOfDates)
                           .SingleOrDefault();

问题是将x.ListOfDatesitem.listOfDates进行比较是不起作用的。

没有编译器错误,但我怀疑返回的值列表不同。如何使列表通用化以便进行比较?

更新#1

这似乎可以将listOfDates转换为类似的格式:

IEnumerable<DateTime> tempList = item.listOfDates.Select(x => x.DATE).ToList()

然后我遵循了@Matt Burland 的"SequenceEqual"建议

C#LINQ-比较IEnumerable<;字符串>;对照一份匿名名单

您只需比较一个IEnumerable<DateTime>和另一个IEnumerable<DateTime>,您需要比较序列。幸运的是,这里应该有Enumerable.SequenceEquals(静态和扩展方法风格)。

所以类似于:

var record = someObjectList
    .Where(x => x.NAME == item.NAME &&  x.ListOfDates.SequenceEquals(item.listOfDates))
    .SingleOrDefault();