У меня есть список (Foo), и я хочу посмотреть, совпадает ли он с другим списком (foo). Каков самый быстрый способ?
Самый быстрый способ сравнить два списка
Ответ 1
Вот шаги, которые я сделал бы:
- Сделайте object.ReferenceEquals(), если true, затем верните true.
- Проверяйте, если не то же самое, return false.
- Сравните элементы один за другим.
Вот несколько предложений для метода:
- Основы реализации на ICollection. Это дает вам счет, но не ограничивает конкретный тип коллекции или тип содержимого.
- Вы можете реализовать метод как метод расширения для ICollection.
- Вам понадобится использовать .Equals() для сравнения элементов списка.
Ответ 2
Начиная с 3.5, вы можете использовать функцию LINQ для этого:
List<string> l1 = new List<string> {"Hello", "World","How","Are","You"};
List<string> l2 = new List<string> {"Hello","World","How","Are","You"};
Console.WriteLine(l1.SequenceEqual(l2));
Он также знает перегрузку, чтобы предоставить свой собственный компаратор
Ответ 3
Что-то вроде этого:
public static bool CompareLists(List<int> l1, List<int> l2)
{
if (l1 == l2) return true;
if (l1.Count != l2.Count) return false;
for (int i=0; i<l1.Count; i++)
if (l1[i] != l2[i]) return false;
return true;
}
Может потребоваться некоторая дополнительная проверка ошибок (например, нулевые проверки).
Ответ 4
Что-то вроде этого, возможно, с помощью Match Action.
public static CompareList<T>(IList<T> obj1, IList<T> obj2, Action<T,T> match)
{
if (obj1.Count != obj2.Count) return false;
for (int i = 0; i < obj1.Count; i++)
{
if (obj2[i] != null && !match(obj1[i], obj2[i]))
return false;
}
}
Ответ 5
Предполагая, что вы хотите знать, соответствует ли СОДЕРЖАНИЕ (не только ссылка на объект списка).
Если вы будете проводить проверку равенства гораздо чаще, чем вставки, то вы можете обнаружить, что более эффективно генерировать хэш-код каждый раз при вставлении значения и сравнивать хэш-коды при выполнении проверки равенства. Обратите внимание, что вам стоит подумать о важности заказа или просто о том, что списки имеют одинаковое содержимое в любом порядке.
Если вы не очень часто сравниваете, я думаю, что это обычно будет пустой тратой.
Ответ 6
Один ярлык, о котором я не упоминал, заключается в том, что если вы знаете, как были созданы списки, вы можете присоединиться к ним в строки и сравнить напрямую.
Например...
В моем случае я хотел запросить у пользователя список слов. Я хотел убедиться, что каждое слово начинается с буквы, но после этого оно может содержать буквы, цифры или символы подчеркивания. Я особенно обеспокоен тем, что пользователи будут использовать тире или начинать с номеров.
Я использую регулярные выражения, чтобы разбить его на 2 списка, и они соединяют их вместе и сравнивают их как строки:
var testList = userInput.match(/[-|\w]+/g)
/*the above catches common errors:
using dash or starting with a numeric*/
listToUse = userInput.match(/[a-zA-Z]\w*/g)
if (listToUse.join(" ") != testList.join(" ")) {
return "the lists don't match"
Поскольку я знал, что ни один список не будет содержать пробелы, и что списки содержат только простые строки, я мог бы объединить их вместе с пробелом и сравнить их.