Enum.compareByName în Dart

Compară două valori enum după nume (alfabetic); compareByIndex le compară după ordinea din declarație.

Sintaxă
static int compareByName<T extends Enum>(T value1, T value2)
static int compareByIndex<T extends Enum>(T value1, T value2)

Ce face Enum.compareByName

Valorile enum nu sunt Comparable, deci lista.sort() fără argument nu funcționează pentru ele. Enum.compareByName le compară alfabetic după name, iar Enum.compareByIndex după poziția din declarație.

Fiind funcții statice, le dai direct ca argument: lista.sort(Enum.compareByName). Rezultatul este negativ, zero sau pozitiv, ca la orice comparator.

Parametri

Parametru Descriere
value1, value2 Valorile comparate, din același enum.

Ce returnează

Un int: negativ, 0 sau pozitiv.

Exemple

Exemplul 1: Sortare după nume și după ordine

enum Zi { luni, marti, miercuri, joi, vineri }

void main() {
  var ture = [Zi.vineri, Zi.luni, Zi.joi, Zi.marti];
  ture.sort(Enum.compareByName);
  print(ture.map((z) => z.name).toList());
  ture.sort(Enum.compareByIndex);
  print(ture.map((z) => z.name).toList());
  print(Enum.compareByName(Zi.joi, Zi.luni) < 0);
}

Rezultat

[joi, luni, marti, vineri]
[luni, marti, joi, vineri]
true

Exemplul 2: Grupare după categorie, în ordine alfabetică

enum Categorie { lactate, fructe, panificatie, bauturi }

void main() {
  var produse = {
    'Lapte': Categorie.lactate,
    'Mere': Categorie.fructe,
    'Pâine': Categorie.panificatie,
    'Suc': Categorie.bauturi,
    'Iaurt': Categorie.lactate,
  };
  var categorii = produse.values.toSet().toList()..sort(Enum.compareByName);
  for (var c in categorii) {
    var nume = produse.entries.where((e) => e.value == c).map((e) => e.key);
    print('${c.name}: ${nume.join(', ')}');
  }
}

Rezultat

bauturi: Suc
fructe: Mere
lactate: Lapte, Iaurt
panificatie: Pâine

Greșeli frecvente

  • Apelezi lista.sort() pe o listă de enum-uri: aruncă eroare la rulare, pentru că valorile nu sunt Comparable. Dă un comparator.

Comenzi înrudite

  • Enum.name: Numele valorii enum, ca text, exact cum este scris în declarație (fără numele tipului).
  • Enum: Clasa de bază a tuturor tipurilor enum; index dă poziția valorii în declarație, începând de la 0.
  • Comparable.compare: Funcție statică ce compară două valori Comparable: același rezultat ca a.compareTo(b), dar se poate da ca argument.
  • List.sort: Sortează lista pe loc, crescător sau după o funcție de comparare.