.NET 8.0'daki yenilikler [12]: Dondurulmuş nesneler kümesi

Womanne

Member
.NET 8.0 iki yeni nesne kümesi sunuyor FrozenSet<T> VE FrozenDictionary<T, T> yeni ad alanında System.Collections.Frozen. Bu miktarlar dondurulduğunda öğeleri oluşturduktan sonra düzenleyemez, ekleyemez veya silemezsiniz. Bunu yapmak için içeriği .NET'te bulunan diğer nesne kümelerinden daha hızlı sunarlar.

Duyuru








Dr. Holger Schwichtenberg, 53 tanınmış uzmanıyla çok sayıda orta ve büyük ölçekli şirketi danışmanlık, eğitim ve yazılım geliştirme yoluyla destekleyen www.IT-Visions.de uzman ağının teknik direktörüdür. Çok sayıda ulusal ve uluslararası konferansa katılımı, 90'dan fazla uzmanlık kitabı ve 1.500'den fazla uzmanlık makalesi sayesinde Holger Schwichtenberg, .NET ve web teknolojileri konusunda Almanya'nın en tanınmış uzmanlarından biridir.







İki yeni arayüz genişletme yöntemini kullanarak dondurulmuş bir küme oluşturabilirsiniz IEnumerable<T>:

  • ToFrozenSet() kümesini bir örneği olarak döndürür FrozenSet<T> Geriye doğru
  • ToFrozenDictionary() kümesini bir örneği olarak döndürür FrozenDictionary<T, T> Geriye doğru.
Bu yöntemler “dondurulmuş” bir liste veya sözlük (ad-değer çiftleriyle) oluşturur.

2005'ten beri mevcut olan .NET Framework 2.0 arasında üç fark vardır ReadOnlyCollection<T> ve şimdi .NET 8.0'da tanıtılan sürüm FrozenSet<T>:

  • Uygulamaları ReadOnlyCollection<T> yalnızca kullanabileceğiniz başka bir kümenin görünümünü temsil eder AsReadOnly() oluşturuldu. Öte yandan, FrozentSet<T> bağımsız bir bütün.
  • FrozenSet<T> indeksleyici yok: frozenSet× yani işe yaramıyor.
  • FrozentSet<T> kümeler kopyalara izin vermediğinden kopyalar içeremez


Aşağıdaki kod kullanımını gösterir FrozenSet diğer nesne kümeleriyle karşılaştırıldığında:


/// <summary>
/// Klasse System.Collections.Frozen.FrozenSet:
/// Eine nur lesbare einfache Liste.
/// Duplikate warden automatisch entfernt!
/// </summary>
public void FrozenSet()
{
CUI.H2(nameof(FrozenSet));

CUI.H3("FrozenSet aus Array");
int[] Zahlen = new int[] { 1, 2, 3 };
var f = Zahlen.ToFrozenSet();
Console.WriteLine(f.GetType().FullName);

CUI.H3("FrozenSet aus List");
List<int> list = new List<int> { 42, 10, 50, 42 };
FrozenSet<int> frozenSet = list.ToFrozenSet();
Console.WriteLine(frozenSet.GetType().FullName);
Console.WriteLine(frozenSet.Count); // nur 3, da keine Duplikate!

#region -------------------
// Änderung --> FrozenSet hat keinen Indexer,
// kein Add(), kein Remove()
//frozenSet[2] = 10; // Ändern nicht möglich
//frozenSet.Add(42); // Hinzufügen nicht möglich!!
//frozenSet.Remove(42); // Hinzufügen nicht möglich!!
#endregion

CUI.H3("ReadOnlyCollection aus List");
// gab es schon vor .NET 8.0 :) -->
// ReadOnlyCollection<T> ist nur Sicht auf eine andere Menge,
// die man mit AsReadOnly() erzeugt.
ReadOnlyCollection<int> readonlyList = list.AsReadOnly();
Console.WriteLine(readonlyList.GetType().FullName);
//readonlyList[2] = 10; // Ändern nicht möglich
//readonlyList.Add(42); // Hinzufügen nicht möglich!!

CUI.H3("ImmutableList aus List"); // gab es schon vor .NET 8.0 :)
ImmutableList<int> immutableList = list.ToImmutableList();
Console.WriteLine(immutableList.GetType().FullName);
//immutableList[2] = 10; // Ändern nicht möglich
var newImmutableList = immutableList.Add(42);
// Hinzufügen IST möglich, aber man bekommt eine neue Liste!

#region ------------------- Änderungen in Ursprungsliste
CUI.H3("Ein Element ändern");
list[2] += 1; // drittes Element der Ursprungsliste ändern
Console.WriteLine(list[2]); // 51
Console.WriteLine(readonlyList[2]); // 51
Console.WriteLine(immutableList.ElementAt(2)); // ist immer noch 50!
Console.WriteLine(frozenSet.ElementAt(2)); // ist immer noch 50!
#endregion

#region ------------------- Elemente hinzufügen in Ursprungsliste
CUI.H3("Ein Element hinzufügen");
list.Add(77); // Ein fünftes Element ergänzen
Console.WriteLine($"List count: {list.Count}"); // == 5!
// == 5 weil: ReadOnlyList ist eine Sicht auf List<T>!:
Console.WriteLine($"ReadOnlyList count: {readonlyList.Count}");
// == 4 weil vorheriger Zustand der Liste:
Console.WriteLine($"ImmutableList count: {immutableList.Count}");
// == 5 neue Liste:
Console.WriteLine($"new ImmutableList count: {newImmutableList.Count}");
// == 3 FrozenSET: vorheriger Zustand, keine Duplikate:
Console.WriteLine($"FrozenSet count: {frozenSet.Count}");
#endregion
}



Kullanımı FrozenDictionary aşağıdaki kod parçacığını gösterir:


public void FrozenDic()
{
CUI.H2(nameof(FrozenDic));
List<int> list = new List<int> { 42, 10, 50, 42 };

CUI.H3("FrozenDictionary aus List");
FrozenDictionary<int, string> frozenDic =
list.Distinct().ToFrozenDictionary(x => x,
x => "Zahl " + x.ToString());
Console.WriteLine(frozenDic.Count); // 3
// frozenDic[0] = 2;
// frozenDic.TryAdd(0, "Zahl 0"); // "Not supported"

Console.WriteLine(frozenDic.GetType().FullName);
}
}




(kendim)



Haberin Sonu
 
Üst