2012-05-31 11 views
0

Мой вопрос, как этот: c# list compareСравнить два List <> на C#

, но единственное, что нужно отметить, это:

Я использую .NET Framework 2.0

Так как могу ли я сравнить два списка на C# framework 2 и вернуть логическое значение, если элементы разные?

instance == anotherone fails 
instance.Equals(anotherone) fails. 

Edit:

Они оба Список

Edit 2

Я пытаюсь сравнить, если список значений точно. Я могу сортировать их, np для этого. Проблема заключается в изменении количества или значений элементов. Например:

List1->Item1 = "A" 
List1->Item2 = "B" 

List2->Item1 = "B" 
List2->Item2 = "A" 

//must return true 


List1->Item1 = "A" 
List1->Item2 = "B" 

List2->Item1 = "B" 
List2->Item2 = "C" 

//must return false 

List1->Item1 = "A" 
List1->Item2 = "B" 

List2->Item1 = "B" 
List2->Item2 = "A" 
List2->Item3 = "A" 

//must return false, etc. 

Спасибо и просим.

+1

какие типы? Определенные экземпляры класса? информации недостаточно, напишите пожалуйста более подробную информацию: – levi

+1

Вы заботитесь о порядке элементов в списке или равны ли два списка, если они содержат одни и те же элементы, независимо от порядка? – FishBasketGordo

+0

Мне все равно, потому что я могу сортировать их раньше, если это необходимо для сравнения. Я ищу, если они были добавлены и/или удалены и/или обновлены до другого значения. –

ответ

5

На вопрос, на который вы ссылаетесь при вычислении пересечения, вам нужно будет реализовать свою собственную версию Intersect. Это поможет вам начать:

List<T> Intersect<T>(List<T> first, List<T> second) { 
    Dictionary<T, T> potential = new Dictionary<T, T>(); 
    foreach (var item in first) { 
     potential.Add(item, item); 
    } 
    List<T> intersection = new List<T>(); 
    foreach (var item in second) { 
     if (potential.Remove(item)) { 
      intersection.Add(item); 
     } 
    } 
    return intersection; 
} 

Чтобы справиться, если они имеют одни и те же элементы с той же частотой:

bool AreSameAsMultiSets(List<T> first, List<T> second) { 
    Dictionary<T, int> counts = new Dictionary<T, int>();  
    foreach (var item in first) { 
     if (!counts.ContainsKey(item)) { 
      counts.Add(item, 0); 
     } 
     counts[item] = counts[item] + 1; 
    } 
    foreach (var item in second) { 
     if (!counts.ContainsKey(item)) { 
      return false; 
     } 
     counts[item] = counts[item] - 1; 
    } 
    foreach (var entry in counts) { 
     if (entry.Value != 0) { 
      return false; 
     } 
    } 
    return true; 
} 

Вы, вероятно, следует добавить некоторые обработки ошибок вышеупомянутому (первый не равно нулю, второй не равен нулю). Обратите внимание, что вы не можете использовать HashSet<T>, так как вы находитесь в .NET 2.0.

+0

Я не уверен, что «Интерсект» - это то, что он хочет здесь. – Rawling

+0

извините, но не можете ли вы подробнее описать свой код? Благодарю. –

+2

@ Rawling: вопрос, на который он ссылается, спрашивает, как вычислить пересечение.Обратите внимание, что мой второй метод «AreSameAsMultiSets» решает вопрос о том, есть ли у них одинаковые элементы. – jason

3

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

public static bool ListsEqual<T>(List<T> list1, List<T> 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; 
} 
+1

Почему downvote? Если вы не объясните, что вы считаете неправильным, оно не может улучшить ответ. – Guffa

+0

ОП указывает (не уверен, был ли он добавлен после вашего ответа или нет), что два списка равны, если они имеют те же элементы, которые НЕ находятся в одном порядке. Для записи я не сделал ни слова. – Servy

+0

Извините, я указал «деталь заказа» после ответа. Я проголосую за него, полезен для меня. –

1

Леандро,

Вы также можете использовать мой с открытым исходным кодом .NET Сравнение объектов Библиотека. Вы должны установить для параметра Config.IgnoreCollectionOrder значение true.

https://comparenetobjects.codeplex.com/

[Test] 
public void ComparerIgnoreOrderSimpleArraysTest() 
{ 
    var a = new String[] { "A", "E", "F" }; 
    var b = new String[] { "A", "c", "d", "F" }; 

    var comparer = new CompareLogic(); 
    comparer.Config.IgnoreCollectionOrder = true; 
    comparer.Config.MaxDifferences = int.MaxValue; 

    ComparisonResult result = comparer.Compare(a, b); 
    Console.WriteLine(result.DifferencesString); 
    Assert.IsTrue(result.Differences.Where(d => d.Object1Value == "E").Count() == 1); 
    Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "c").Count() == 1); 
    Assert.IsTrue(result.Differences.Where(d => d.Object2Value == "d").Count() == 1); 

} 
+0

это немного устарело, но спасибо! +1 –

Смежные вопросы