2011-09-04 90 views
1

我有兩個數組,我知道它們是否有共同的元素最簡單的方法。所以實際上這個問題有問題。最簡單的連接(交集)代碼

string[] countries1 = new string[] { "USA", "Uruguay", "India", "UK"}; 
string[] countries2 = new string[] { "Urguay", "Argentina", "Brasil", "Chile" }; 
foreach (string country in countries1) 
    if (countries2.Contains(country)) 
     return true; 
return false; 
  1. 什麼是最簡單的LINQ查詢,這將讓我知道如果任何country1國家也是country2陣列?
  2. 什麼是最簡單的linq查詢,將返回每個重複國家的數組?

回答

9

1)var isIntersection = countries1.Intersect(countries2).Any();

2)var intersectedCountries = countries1.Intersect(countries2);

+0

在第一個例子中有一個額外的支架! –

+0

@ AS-CII,感謝您的發現。我修好了。 –

2

對於國家1和2之間的交集:

countries1.Intersect(countries2).ToArray()

+2

爲什麼要使用'Count'方法?在我看來,「任何」都更好。 :) –

+0

我錯過了「計數」的問題。它正在對同一陣列中的重複項目進行計數。實際上,Any方法是這種情況下的最佳選擇。 –

1

Adilson的回答涵蓋了你的問題#2,和對於問題1

什麼是最簡單的linq查詢,讓我知道是否有任何country1國家也在country2數組中?

你會做:

countries1.Intersect(countries2).Any(); 

.Any()將返回true在比賽的第一個實例,而.Count().ToArray()會遍歷整個列表。

1

使用LINQ:

var commonCountries = countries1.Intersect(countries2); 

if (commonCountries.Any()) 
    // There are common countries. 

但是,這並沒有考慮到字符串套管等,你可能想要做什麼,是一起夾頭快速IEqualityComparer<string>

public class OrdinalStringComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string s1, string s2) 
    { 
     return string.Equals(s1, s2, StringComparison.OrdinalCultureIgnoreCase); 
    } 
    public int GetHashCode(string str) 
    { 
     return (str == null) ? 0 : str.GetHashCode(); 
    } 
} 

然後通過與你的Intersect聯繫:

var commonCountries = countries1.Intersect(countries2, new OrdinalStringComparer());