让SequenceEqual为列表工作

pri*_*kar 5 c# linq

我有一个名为Country的班级.它有公共成员,'CountryName'和'States'.

我已经宣布了一份国家名单.

现在我想写一个函数接受一个新的'Country'并决定CountryList是否已经有'Country'.

我试着写一个像这样的函数

bool CheckCountry(Country c)
{
    return CountryList.Exists(p => p.CountryName == c.Name
                                && p.States.SequenceEqual(c.States));
}
Run Code Online (Sandbox Code Playgroud)

由于我想使用States的CountryName属性比较状态,我想修改我的函数,以便SequenceEqual基于状态的CountryName工作?

Eri*_*ert 12

将其分解为许多简单查询,然后将这些查询重新组合在一起.

让我们从一系列按名称匹配的项目开始:

var nameMatches = from item in itemList where item.Name == p.Name select item;
Run Code Online (Sandbox Code Playgroud)

我们需要将这些项与p的子项中的名称序列进行比较.这是什么序列? 写一个查询:

var pnames = from subitem in p.SubItems select subitem.Name;
Run Code Online (Sandbox Code Playgroud)

现在,您要查找nameMatches中名称序列匹配的所有元素.你怎么得到名字的序列?好吧,我们刚看到如何使用pnames,所以做同样的事情:

var matches = from item in nameMatches
              let subitemNames = 
                  (from subitem in item.SubItems select subitem.Name)
              where pnames.SequenceEqual(subitemNames)
              select item;
Run Code Online (Sandbox Code Playgroud)

现在你想知道,有没有比赛?

return matches.Any();
Run Code Online (Sandbox Code Playgroud)

这应该工作得很好.但是如果你想成为真正的buff,你可以在一个大问题中写下整个事情!

return (
    from item in itemList
    let pnames = 
        (from psubitem in p.SubItems select psubitem.Name)
    let subitemNames = 
        (from subitem in item.SubItems select subitem.Name)
    where item.Name == p.Name
    where pnames.SequenceEqual(subitemNames)
    select item).Any();
Run Code Online (Sandbox Code Playgroud)

而且你已经完成了.非常简单!请记住,将其分解为小步骤,单独解决每个问题,然后将解决方案放在小结果之外.

  • 我真的很想知道这是否是由C#-team上的某人在阅读时写的.事实证明:Eric Lippert当然是关于C#-team的! (2认同)