让SequenceEqual为列表工作

时间:2009-06-16 02:34:51

标签: c# linq

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

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

现在我想编写一个接受新“国家”的函数,并决定CountryList是否已经拥有'Country'。

我尝试编写像

这样的函数
bool CheckCountry(Country c)
{
    return CountryList.Exists(p => p.CountryName == c.Name
                                && p.States.SequenceEqual(c.States));
}

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

3 个答案:

答案 0 :(得分:12)

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

让我们首先制作一系列按名称匹配的项目:

var nameMatches = from item in itemList where item.Name == p.Name select item;

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

var pnames = from subitem in p.SubItems select subitem.Name;

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

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

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

return matches.Any();

这应该可以正常工作。但是如果你想成为真正的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();

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

答案 1 :(得分:1)

你看过在Item上实现IComparer吗?

答案 2 :(得分:1)

如果我理解正确,你想要一种比较两个项目的方法,首先检查两个项目的名称,然后依次检查每个子项目的名称。这就是你想要的:

    public override bool Equals(object obj)
    {
        return this.Name == (obj as Item).Name;
    }
    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }
    public bool Check(Item obj)
    {
        if (this.Name != obj.Name)
            return false;
        //if the lists arent of the same length then they 
        //obviously dont contain the same items, and besides 
        //there would be an exception on the next check
        if (this.SubItems.Count != obj.SubItems.Count)
            return false;
        for (int i = 0; i < this.SubItems.Count; i++)
            if (this.SubItems[i] != obj.SubItems[i])
                return false;
        return true;
    }