我环顾四周,无法找到这个问题的具体答案。我有两个数组,一个包含一个人列表,另一个包含一个带有name属性的Person对象。我试图遍历对象数组,如果人的.Name中的值等于字符串数组中的对应值,那么我将1添加到计数器。我已经看到了使用Linq给出的答案,但我对此并不熟悉。有没有一个基本的方法来做到这一点,我忽略或我需要使用Linq。提前致谢。 这是我的代码。
int count = 0;
string[] names = new string[]{"John","Jim","Mary","Joan","Tim"};
ObservableCollection<Person> people = (ObservableCollection<Person>)Session["People"];
foreach (var pe in people)
{
for (int i = 0; i < names.Length; i++)
{
if (pe.Name == names[i])
count++;
}
}
答案 0 :(得分:5)
您应该使用HashSet<string>
来存储names
。当Contains
上的Contains
方法 O(n)时,它具有 O(1) string[]
方法。
var set = new HashSet<string>(names);
然后
foreach (var pe in people)
{
if(set.Contains(pe.Name))
count++;
}
或使用LINQ
count = people.Count(person => set.Contains(person.Name));
它将使你的解决方案 O(m)而不是 O(n * m)
答案 1 :(得分:2)
试试这个解决方案:
var count = people.Count(pe => names.Contains(pe.Name));
答案 2 :(得分:1)
您发布的内容将有效。一个更简单的循环版本是:
foreach (var pe in people)
{
if(names.Contains(pe.Name))
count++;
}
使用LINQ,这是一个单线事件:
count = people.Count(person => names.Contains(person.Name));
我强烈建议借此机会熟悉LINQ。它非常强大,在这样的情况下,代码更简洁,更易读。