循环通过2个数组来比较值c#

时间:2014-03-02 18:00:23

标签: c# asp.net arrays

我环顾四周,无法找到这个问题的具体答案。我有两个数组,一个包含一个人列表,另一个包含一个带有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++;
    }    
}

3 个答案:

答案 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。它非常强大,在这样的情况下,代码更简洁,更易读。