Сравнение Массивов с помощью LINQ в C#

Возможно, вам нужно использовать более низкую версию Gradle в вашем файле build.gradle уровня проекта. Например, для Android N попробуйте использовать:

classpath 'com.android.tools.build:gradle:2.14.1'
21
задан Peter Morris 9 May 2016 в 14:47
поделиться

5 ответов

string[] a = { "a", "b" };
string[] b = { "a", "b" };

return (a.Length == b.Length && a.Intersect(b).Count() == a.Length);

После некоторого тестирования производительности:

  • Более 10 000 маленьких строк - 5 мс
  • Более 100 000 маленьких строк - 99 мс
  • Более 1 000 000 маленьких строк - Сред. 601 мс
  • Более 100 000 ~ 500 строк символов - 190 мс
29
ответ дан 29 November 2019 в 06:25
поделиться

Не уверен насчет производительности, но, похоже, это работает.

string[] a = { "a", "b", "c" };
string[] b = { "a", "b", "c" };

bool result = a.SequenceEqual(b);
Assert.AreEqual(true, result);

Тем не менее, он не зависит от порядка, поэтому он не соответствует требованию OP.

string[] a = { "a", "b", "c" };
string[] b = { "a", "c", "b" };

bool result = a.SequenceEqual(b);
Assert.AreEqual(false, result);
26
ответ дан 29 November 2019 в 06:25
поделиться

Если порядок не имеет значения или могут быть дубликаты, то возможно:

public static class IEnumerableExtensions
{
    public static bool HasSameContentsAs<T>(this ICollection<T> source,
                                            ICollection<T> other)
    {
        if (source.Count != other.Count)
        {
            return false;
        }
        var s = source
            .GroupBy(x => x)
            .ToDictionary(x => x.Key, x => x.Count());
        var o = other
            .GroupBy(x => x)
            .ToDictionary(x => x.Key, x => x.Count());
        int count;
        return s.Count == o.Count &&
               s.All(x => o.TryGetValue(x.Key, out count) &&
                          count == x.Value);
    }
}

Использование:

string[] a = { "a", "b", "c" };
string[] b = { "c", "a", "b" };

bool containSame = a.HasSameContentsAs(b);

Некоторые варианты использования:

  • разной длины (ожидание ложно)

    string[] a = { "a", "b", "c" };
    string[] b = { "b", "c" };
    
  • разный порядок (ожидание истины)

    string[] a = { "a", "b", "c" };
    string[] b = { "b", "c", "a" };
    

также работает, если входные данные могут содержать повторяющиеся элементы, хотя из вопроса о том, желательна ли эта характеристика, неясно, рассмотрим:

  • дублированные элементы имеют одинаковое количество (ожидаемо верно)

    string[] a = { "a", "b", "b", "c" };
    string[] b = { "a", "b", "c", "b" };
    
  • дублированные элементы с различным количеством (ожидаемо ложное)

    string[] a = { "a", "b", "b", "b", "c" };
    string[] b = { "a", "b", "c", "b", "c" };
    
4
ответ дан 29 November 2019 в 06:25
поделиться

Это работает правильно с дубликатами и проверяет каждый элемент

a.Length == b.Length && !a.Where((t, i) => t != b[i]).Any()
2
ответ дан 29 November 2019 в 06:25
поделиться

Я думаю, что это всегда будет операция O(n log n), поэтому я бы просто отсортировал оба массива и сравнил их, например, используя SequenceEqual.

5
ответ дан 29 November 2019 в 06:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: