2014-03-02 81 views
0

我環顧四周,找不到具體的答案,我有這個問題。我有兩個數組,一個擁有一個人名單,另一個擁有一個名爲property的Person對象。我試圖通過對象數組循環,如果人的.Name中的值等於字符串數組中的對應值,那麼我將1加到計數器中。我已經看到了使用Linq給出的答案,但我並不真正熟悉這一點。有沒有一種基本的方式來做到這一點,我忽略了或將需要使用Linq。提前致謝。 這是我的代碼。通過2個數組循環來比較值c#

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

只有一個clar證明:你不需要「使用LINQ」。這些方法僅代表某些問題的優化選擇。您可以使用它們來編寫更少的代碼,或者在某些情況下更快地完成任務。但是任何可以用LINQ完成的工作都可以在沒有它的情況下完成。 – varocarbas

回答

2

嘗試這種解決方案:

var count = people.Count(pe => names.Contains(pe.Name)); 
1

你張貼什麼工作。循環的簡化版本是:

foreach (var pe in people) 
{ 
    if(names.Contains(pe.Name)) 
     count++; 
} 

使用LINQ,這是一個行的事:

count = people.Count(person => names.Contains(person.Name)); 

我會強烈建議借這個機會來熟悉LINQ。它非常強大,在這樣的情況下,代碼更簡潔,更具可讀性。

5

您應該使用HashSet<string>來存儲names。它有O(1)Contains方法,當相同的Contains方法在string[]O(n)

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)