66 votes

Comparer deux listes <string> pour l'égalité

Autre que de parcourir les éléments un par un, comment comparer deux listes de chaînes pour l'égalité (dans .NET 3.0):

Cela échoue:

         // Expected result.
        List<string> expected = new List<string>();
        expected.Add( "a" );
        expected.Add( "b" );
        expected.Add( "c" );

        // Actual result
        actual = new List<string>();
        actual.Add( "a" );
        actual.Add( "b" );
        actual.Add( "c" );

        // Verdict
        Assert.IsTrue( actual == expected );
 

Merci d'avance

80voto

JaredPar Points 333733

Essayez ce qui suit

 var equal = expected.SequenceEqual(actual);
 

Version d'essai

 Assert.IsTrue( actual.SequenceEqual(expected) );
 

La méthode d'extension SequenceEqual comparera les éléments de la collection afin de garantir leur égalité.

Voir http://msdn.microsoft.com/en-us/library/bb348567(v=vs.100).aspx

44voto

dahlbyk Points 24897

De nombreux frameworks de test offrent une classe CollectionAssert:

 CollectionAssert.AreEqual(expected, actual);
 

Par exemple, test MS

13voto

AndreyAkinshin Points 4514

Vous pouvez toujours écrire la fonction nécessaire eux-mêmes:

 public static bool ListEquals<T>(IList<T> list1, IList<T> list2) {
    if (list1.Count != list2.Count)
        return false;
    for (int i = 0; i < list1.Count; i++)
        if (!list1[i].Equals(list2[i]))
            return false;
    return true;
}
 

et l'utiliser:

 // Expected result.
List<string> expected = new List<string>();
expected.Add( "a" );
expected.Add( "b" );
expected.Add( "c" );

// Actual result
actual = new List<string>();
actual.Add( "a" );
actual.Add( "b" );
actual.Add( "c" );

// Verdict
Assert.IsTrue( ListEquals(actual, expected) );
 

10voto

bobbymcr Points 14916

J'ai remarqué que personne n'ai dit que vous pourquoi votre code d'origine n'a pas fonctionné. C'est parce que l' == de l'opérateur, en général, les tests de référence de l'égalité (c'est à dire si les deux instances sont pointant vers le même objet en mémoire), à moins que l'opérateur a été surchargé. List<T> ne définissent pas l' == de l'opérateur de sorte que la base de référence est égal à la mise en œuvre est utilisée.

Comme d'autres affiches ont démontré, vous aurez généralement à l'étape à travers des éléments de test "de la collection de l'égalité." Bien sûr, vous devez utiliser l'optimisation suggéré par l'utilisateur marcheur des rêves qui commence par tester le nombre de collections avant de pouvoir marcher à travers eux.

1voto

Abhijeet Patel Points 2116

Vous pouvez écrire une méthode d'extension comme ceci:

 public static class ListExtensions
    {
        public static bool IsEqual<T>(this IList<T> list,IList<T> target, IComparer<T> comparer) where T:IComparable<T>
        {
            if (list.Count != target.Count)
            {
                return false;
            }
            int index = 0;
            while (index < list.Count && 
                   comparer.Compare(list[index],target[index]) == 0)
            {
                index++;
            }
            if (index != list.Count)
            {
                return false;
            }
            return true;
        }
    }
 

Et appelez comme ça:

 List<int> intList = new List<int> { 1, 234, 2, 324, 324, 2 };
List<int> targetList = new List<int> { 1, 234, 2, 324, 324 };
bool isEqual = intList.IsEqual(targetList, Comparer<int>.Default);
 

EDIT: Mise à jour du code pour utiliser une méthode statique à la place, car OP utilise .NET 3.0.

 public static bool IsEqual<T>(IList<T> sourceList, IList<T> targetList, IComparer<T> comparer) where T : IComparable<T>
        {
            if (sourceList.Count != targetList.Count)
            {
                return false;
            }
            int index = 0;
            while (index < sourceList.Count &&
                   comparer.Compare(sourceList[index], targetList[index]) == 0)
            {
                index++;
            }
            if (index != sourceList.Count)
            {
                return false;
            }
            return true;
        }
 

Client:

         bool isEqual = IsEqual(intList,targetList, Comparer<int>.Default);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X