Подтвердить что ты не робот

Как сравнить два списка <String> друг с другом?

Пусть говорят, что

List<string> a1 = new List<string>();

List<string> a2 = new List<string>();

Есть ли способ сделать это?

if (a1 == a2) 
{

}
4b9b3361

Ответ 1

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

if (a1.SequenceEqual(a2))

Посмотрите, как он работает в Интернете: ideone

Ответ 2

Я обнаружил, что SequenceEqual не самый эффективный способ сравнить два списка строк (первоначально из http://www.dotnetperls.com/sequenceequal).

Я хотел проверить это самостоятельно, поэтому создал два метода:

    /// <summary>
    /// Compares two string lists using LINQ SequenceEqual.
    /// </summary>
    public bool CompareLists1(List<string> list1, List<string> list2)
    {
        return list1.SequenceEqual(list2);
    }

    /// <summary>
    /// Compares two string lists using a loop.
    /// </summary>
    public bool CompareLists2(List<string> list1, List<string> list2)
    {
        if (list1.Count != list2.Count)
            return false;

        for (int i = 0; i < list1.Count; i++)
        {
            if (list1[i] != list2[i])
                return false;
        }

        return true;
    }

Второй метод - это бит кода, с которым я столкнулся, и задался вопросом, можно ли его реорганизовать как "более легкое для чтения". (И также задался вопросом, будет ли оптимизация LINQ быстрее.)

Как оказалось, с двумя списками, содержащими строки 32k, более 100 исполнений:

  • Метод 1 взял в среднем 6761,8 тиков
  • Метод 2 занял в среднем 3268,4 тика

Я обычно предпочитаю LINQ для краткости, производительности и удобочитаемости кода; но в этом случае я думаю, что предпочтительным является метод, основанный на петле.

Edit:

Я перекомпилировал с использованием оптимизированного кода и проверил тест на 1000 итераций. Результаты по-прежнему благоприятствуют циклу (тем более):

  • Метод 1 занял в среднем 4227,2 тика
  • В способе 2 в среднем было 1831,9 тиков

Протестировано с использованием Visual Studio 2010, С#.NET 4 Профиль клиента на ядре i7-920

Ответ 3

Вы также можете использовать Except (производит заданное различие двух последовательностей), чтобы проверить, есть ли разница или нет:

IEnumerable<string> difference = a1.Except(a2);
if(!difference.Any()){}

Ответ 4

    private static bool CompareDictionaries(IDictionary<string, IEnumerable<string>> dict1, IDictionary<string, IEnumerable<string>> dict2)
    {
        if (dict1.Count != dict2.Count)
        {
            return false;
        }

        var keyDiff = dict1.Keys.Except(dict2.Keys);
        if (keyDiff.Any())
        {
            return false;
        }

        return (from key in dict1.Keys 
                let value1 = dict1[key] 
                let value2 = dict2[key] 
                select value1.Except(value2)).All(diffInValues => !diffInValues.Any());
    }

Ответ 5

Вы можете проверить все приведенные ниже способы для списка

List<string> FilteredList = new List<string>();
//Comparing the two lists and gettings common elements.
FilteredList = a1.Intersect(a2, StringComparer.OrdinalIgnoreCase);