Код простейшего соединения (пересечения) - PullRequest
1 голос
/ 04 сентября 2011

У меня есть два массива, и я простейший способ узнать, есть ли у них общие элементы. Так что на самом деле этот вопрос есть вопросы.

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 даст мне знать, есть ли в массиве country2 какая-либо из стран country1?
  2. Какой самый простой запрос linq, который будет возвращать массив каждой повторяющейся страны?

Ответы [ 4 ]

9 голосов
/ 04 сентября 2011

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

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

2 голосов
/ 04 сентября 2011

Для пересечения между странами 1 и 2:

countries1.Intersect(countries2).ToArray()

1 голос
/ 04 сентября 2011

С 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());
1 голос
/ 04 сентября 2011

Ответ Адилсона охватывает ваш вопрос № 2, а также вопрос № 1

Какой самый простой запрос linq даст мне знать, если какая-либо из стран страны1 также есть в массиве страны2?

Вы бы сделали:

countries1.Intersect(countries2).Any();

.Any() вернет true в первом случае совпадения, тогда как .Count() или .ToArray() будет выполнять итерацию всего списка.

...