我有一个名为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工作?
答案 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;
}