установить равенство в linq

  1. Функция ожидает строку.

  2. file_exists() не работает с URL-адресами HTTP.

8
задан Alsin 3 June 2009 в 03:37
поделиться

5 ответов

Ну, это зависит от того, как вы интерпретируете свои списки.

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

    public bool AreEqual<T>(IList<T> A, IList<T> B)
    {
        if (A.Count != B.Count)
            return false;
        for (int i = 0; i < A.Count; i++)
            if (!A[i].Equals(B[i])) 
                return false;
    }

Если вы рассматриваете свои списки как наборы (так что порядок элементов не имеет значения), то ... я думаю, вы используете неправильные структуры данных:

    public bool AreEqual<T>(IList<T> A, IList<T> B)
    {
        HashSet<T> setA = new HashSet<T>(A);
        return setA.SetEquals(B);
    }
7
ответ дан 3 November 2019 в 14:38
поделиться

Это зависит от того, что вы подразумеваете под «списком равных». Если вы имеете в виду, что они содержат одни и те же объекты, решение, предложенное Даниэлем, подходит, просто объедините () два списка и посчитайте элементы.

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

1
ответ дан 3 November 2019 в 14:38
поделиться

Если порядок элементов списка важен:

bool areEqual = a.SequenceEqual(b);

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

// assumes that the list items are ints
bool areEqual = new HashSet<int>(a).SetEquals(b);

(Метод SequenceEqual и Конструктор HashSet имеет перегрузки, которые принимают параметр IEqualityComparer , если вам нужна эта функциональность.)

18
ответ дан 3 November 2019 в 14:38
поделиться

На самом деле здесь нет ярлыка, если списки не отсортированы, и в этом случае вы можете сравнивать элементы один за другим. И, очевидно, я предполагаю, что порядок не имеет значения, иначе очевидно, что вы также можете сравнить их один за другим.

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

public static bool IsEqual<T>(this List<T> x1, List<T> x2)
{
    if(x1.Count != x2.Count) return false;

    var x1Elements = new Dictionary<T, int>();

    foreach(var item in x1)
    {
        int n; x1Elements.TryGetValue(item, out n);
        x1Elements[item] = n+1;
    }

    foreach(var item in x2)
    {
        int n; x1Elements.TryGetValue(item, out n);
        if(n <= 0) return false; // this element was in x2 but not x1
        else x1Elements[item] = n-1;
    }

    // make sure x1 didn't have any elements
    // that weren't in x2

    return x1Elements.Values.All(x => x == 0);
}
1
ответ дан 3 November 2019 в 14:38
поделиться

Первый снимок - если они содержат одинаковые элементы, объединение обоих списков должно иметь такое же количество элементов, что и любой из обоих списков.

listA.Union(listB).Count() == listA.Count()

Примечание: Ошибка, если один список пуст .

Но, вероятно, это все еще операция O (n²) .

Другое решение - списки должны иметь одинаковую длину, а список A минус список B не должен содержать никаких элементов.

(listA.Count() == listB.Count()) && !listA.Except(listB).Any()
-1
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

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