vasos tutorial lenguaje google español container dart

tutorial - dart vasos



¿Cómo puedo comparar las listas de igualdad en Dart? (9)

¿Funcionaría algo como esto para ti?

try { Expect.listEquals(list1, list2); } catch (var e) { print("lists aren''t equal: $e"); }

Ejemplo:

main() { List<int> list1 = [1, 2, 3, 4, 5]; List<int> list2 = new List.from(list1); try { Expect.listEquals(list1, list2); } catch (var e) { print("lists aren''t equal: $e"); } list1.removeLast(); try { Expect.listEquals(list1, list2); } catch (var e) { print("Lists aren''t equal: $e"); } }

Impresiones de segundo intento:

Lists aren''t equal: Expect.listEquals(list length, expected: <4>, actual: <5>) fails

Estoy comparando dos listas en Dart así:

main() { if ([1,2,3] == [1,2,3]) { print("Equal"); } else { print("Not equal"); } }

Pero nunca son iguales. No parece haber un método igual () en la API de Dart para comparar listas o colecciones. ¿Hay una manera adecuada de hacer esto?


Antes de que las cosas funcionen, puedes usar esto:

/** * Returns true if the two given lists are equal. */ bool _listsAreEqual(List one, List two) { var i = -1; return one.every((element) { i++; return two[i] == element; }); }



Las colecciones en Dart no tienen igualdad inherente. Dos conjuntos no son iguales, incluso si contienen exactamente los mismos objetos que los elementos.

La biblioteca de colecciones proporciona métodos para definir tal igualdad. En este caso, por ejemplo.

IterableEquality().equals([1,2,3],[1,2,3])

Es una igualdad que considera dos listas iguales exactamente si contienen elementos idénticos.



Otra opción es utilizar el paquete "consultas".

import ''package:queries/collections.dart''; void main() { var list1 = [1, 2, 3]; var list2 = [1, 2, 3]; var col1 = new Collection(list1); var col2 = new Collection(list2); if (col1.sequenceEqual(col2)) { print("Lists equal"); } else { print("Lists not equal"); } }

Función sequenceEqual declarada de la siguiente manera:

bool sequenceEqual(IEnumerable<TSource> other, [IEqualityComparer<TSource> comparer])

Esta función se puede utilizar para comparar cualquier secuencia de datos. También es posible utilizar el comparador de igualdad de datos definido por el usuario. Por defecto se utilizan comparadores integrados.


Para completar la respuesta de Gunter: la forma recomendada de comparar listas de igualdad (en lugar de identidad) es mediante el uso de las clases de igualdad del siguiente paquete

import ''package:collection/collection.dart'';

Edición : antes de 1.13, era paquete ''import: collection / equality.dart'';

P.ej,

Function eq = const ListEquality().equals; print(eq([1,''two'',3], [1,''two'',3])); // => true

Lo anterior se imprime true porque los elementos de lista correspondientes que son identical() . Si desea (en profundidad) comparar listas que puedan contener otras colecciones, utilice en su lugar:

Function deepEq = const DeepCollectionEquality().equals; List list1 = [1, [''a'',[]], 3]; List list2 = [1, [''a'',[]], 3]; print( eq(list1, list2)); // => false print(deepEq(list1, list2)); // => true

Existen otras clases de Igualdad que se pueden combinar de muchas maneras, incluida la igualdad para los Map . Incluso puede realizar una comparación desordenada (profunda) de colecciones:

Function unOrdDeepEq = const DeepCollectionEquality.unordered().equals; List list3 = [3, [[],''a''], 1]; print(unOrdDeepEq(list2, list3)); // => true

Para más detalles vea la documentación de la API del paquete . Como de costumbre, para usar dicho paquete, debe pubspec.yaml en su pubspec.yaml :

dependencies: collection: any


Si bien esta pregunta es bastante antigua, la función aún no ha aterrizado de forma nativa en Dart. Necesitaba una comparación de igualdad profunda ( List<List> ), así que tomé prestado desde arriba ahora con una llamada recursiva:

bool _listsAreEqual(list1, list2) { var i=-1; return list1.every((val) { i++; if(val is List && list2[i] is List) return _listsAreEqual(val,list2[i]); else return list2[i] == val; }); }

Nota: esto seguirá fallando cuando se mezclen los tipos de Colección (es decir, List<Map> ) - solo cubre List<List<List>> y así sucesivamente.

El último problema con los dardos parece ser https://code.google.com/p/dart/issues/detail?id=2217 (última actualización en mayo de 2013).


Si tienes una clase con campo de lista, como

class A { final String name; final List<int> list; A(this.name, this.list); }

y desea comparar sus instancias, puede usar el paquete equatable

class A extends Equatable { final String name; final List<int> list; A(this.name, this.list) : super([name, list]); }

y luego simplemente comparar objetos usando ==

final x = A(''foo'', [1,2,3]); final y = A(''foo'', [1,2,3]); print(x == y); // true