Функция ожидает строку.
file_exists()
не работает с URL-адресами HTTP.
Ну, это зависит от того, как вы интерпретируете свои списки.
Если вы рассматриваете их как кортежи (поэтому порядок элементов в списках имеет значение), вы можете использовать следующий код:
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);
}
Это зависит от того, что вы подразумеваете под «списком равных». Если вы имеете в виду, что они содержат одни и те же объекты, решение, предложенное Даниэлем, подходит, просто объедините () два списка и посчитайте элементы.
Если под «равными» вы имеете в виду, что они имеют одинаковые элементы в списке один и тот же порядок , вам будет лучше сравнить счетчик обоих списков, а затем, если они имеют одинаковое количество, просто повторите с простым для цикла
, чтобы сравнить каждый элемент из обоих списков одновременно индекс. Менее красиво, но быстрее не получится.
Если порядок элементов списка важен:
bool areEqual = a.SequenceEqual(b);
Если списки должны обрабатываться как неупорядоченные наборы:
// assumes that the list items are ints
bool areEqual = new HashSet<int>(a).SetEquals(b);
(Метод SequenceEqual
и Конструктор HashSet
имеет перегрузки, которые принимают параметр IEqualityComparer
, если вам нужна эта функциональность.)
На самом деле здесь нет ярлыка, если списки не отсортированы, и в этом случае вы можете сравнивать элементы один за другим. И, очевидно, я предполагаю, что порядок не имеет значения, иначе очевидно, что вы также можете сравнить их один за другим.
В противном случае я бы предложил наиболее эффективный алгоритм, который вы можете получить для больших списков элементов вероятно, было бы что-то вроде этого, используя хеш-таблицу для отслеживания того, что вы видели (предупреждение: не тестировал, но должно быть ясно, к чему я клоню.)
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);
}
Первый снимок - если они содержат одинаковые элементы, объединение обоих списков должно иметь такое же количество элементов, что и любой из обоих списков.
listA.Union(listB).Count() == listA.Count()
Примечание: Ошибка, если один список пуст .
Но, вероятно, это все еще операция O (n²)
.
Другое решение - списки должны иметь одинаковую длину, а список A минус список B не должен содержать никаких элементов.
(listA.Count() == listB.Count()) && !listA.Except(listB).Any()