C #: как вы проверяете списки одинакового размера и одинаковые элементы? - PullRequest
6 голосов
/ 24 ноября 2010

Есть два списка строк

List<string> A;
List<string> B;

Какой самый короткий код вы бы предложили проверить, чтобы A.Count == B.Count и каждый элемент A в B и наоборот: каждый Bнаходится в A (элементы A и B могут иметь разный порядок).

Ответы [ 6 ]

25 голосов
/ 24 ноября 2010

Если вам не нужно беспокоиться о дубликатах:

bool equal = new HashSet<string>(A).SetEquals(B);

Если вы беспокоитесь о дубликатах, это становится немного более неловким.Это будет работать, но это относительно медленно:

bool equal = A.OrderBy(x => x).SequenceEquals(B.OrderBy(x => x));

Конечно, вы можете сделать оба варианта более эффективными, проверив сначала счетчик, что является простым выражением.Например:

bool equal = (A.Count == B.Count) && new HashSet<string>(A).SetEquals(B);

... но вы запросили самый короткий код:)

2 голосов
/ 24 ноября 2010
A.Count == B.Count && new HashSet<string>(A).SetEquals(B);

Если проблема связана с разной частотой повторений, проверьте этот вопрос .

1 голос
/ 24 ноября 2010

Если вы вызовете Enumerable.Except () в двух списках, это вернет IEnumerable<string>, содержащее все элементы, которые есть в одном списке, но не в другом. Если счетчик равен 0, то вы знаете, что два списка одинаковы.

0 голосов
/ 24 ноября 2010

Как насчет простой петли?

private bool IsEqualLists(List<string> A, List<string> B)
{
    for(int i = 0; i < A.Count; i++)
    {
        if(i < B.Count - 1) {
            return false; }
        else 
        {
            if(!String.Equals(A[i], B[i]) {
                return false;
            }
        }
    }
    return true;
}
0 голосов
/ 24 ноября 2010
var result = A.Count == B.Count && A.Where(y => B.Contains(y)).Count() == A.Count;

Может быть?

0 голосов
/ 24 ноября 2010

Если вас не беспокоят дубликаты, или вы беспокоитесь о дубликатах, но не слишком обеспокоены микрооптимизацией производительности, тогда различные методы в ответе Джона определенно являются подходящим вариантом.

ЕслиВы беспокоитесь о производительности дубликатов и , тогда что-то вроде этого метода расширения должно сработать, хотя оно действительно не соответствует вашим критериям "кратчайшего кода"!

bool hasSameElements = A.HasSameElements(B);

// ...

public static bool HasSameElements<T>(this IList<T> a, IList<T> b)
{
    if (a == b) return true;

    if ((a == null) || (b == null)) return false;

    if (a.Count != b.Count) return false;

    var dict = new Dictionary<string, int>(a.Count);
    foreach (string s in a)
    {
        int count;
        dict.TryGetValue(s, out count);
        dict[s] = count + 1;
    }

    foreach (string s in b)
    {
        int count;
        dict.TryGetValue(s, out count);

        if (count < 1) return false;

        dict[s] = count - 1;
    }

    return dict.All(kvp => kvp.Value == 0);
}

(Примечаниечто этот метод вернет true, если обе последовательности null. Если это не желаемое поведение, то достаточно просто добавить дополнительные null проверки.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...