Szoftverfejlesztés .NET platformon - Jegyzet 4. fejezet

A VIK Wikiből

Ez az oldal a korábbi SCH wikiről lett áthozva.

Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!

Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.


70-536 .NET Framework 2.0 Application Development Foundation

%TOC{depth="3"}%

Gyűjtemények

Azonos típusú objektumok egységes kezelése, műveletek végzése rajtuk. =System.Collections= és =System.Collections.Generic= névterek.

Interfészek:

  • =IEnumerable=: =GetEnumerator()= hívásra visszaad egy =IEnumerator= típusú iterátort, amivel végig lehet lépkedni a kollekción. Az =IEnumerator= property-i és metódusai:
    • =Reset()=
    • =MoveNext()=
    • =Current=
  • =ICollection : IEnumerable=
    • =Count=
    • =IsSynchronized=
    • =SyncRoot=
    • =CopyTo()=
  • =IList : ICollection= (indexelhető kollekció)
    • =IsFixedSize=, =IsReadOnly=
    • =Item=: elemek lekérdezése és módosítása index alapján
    • =Add()=: elem hozzáfűzése a végéhez
    • =Contains()=, =IndexOf()=: elem keresése
    • =Insert()=: elem beszúrása
    • =Remove()=, =RemoveAt()=: elem törlése érték vagy index alapján
    • =Clear()=: lista kiürítése
  • =IComparer= (elemek összehasonlítása)
    • =int Compare(object a, object b)=
      • a<b → negatív a visszatérési értéke
      • a=b → 0 a visszatérési értéke
      • a>b → pozitív a visszatérési értéke
    • =CaseInsensitiveComparer=: stringek összehasonlítása case insensitive módon
  • =IDictionary : ICollection= (kulcs-érték párokból álló kollekció)
    • =Item=: elemek lekérdezése és módosítása kulcs alapján
    • =ICollection Keys=: kulcsok listája
    • =ICollection Values=: értékek listája
    • =IDictionaryEnumerator GetEnumerator()=
    • =Add()=
    • =Contains()=
    • =Remove()=
    • =Clear()=
  • Példa*: kollekció elemeinek felsorolása iterátorral:
IEnumerator enumerator = coll.GetEnumerator();
while (enumerator.MoveNext())
	 Console.WriteLine(enumerator.Current);

Gyűjtemények típusai

Kollekció típusok (=System.Collections= és =System.Collections.Specialized= névterek)

  • =ArrayList=: átméretezhető, indexelhető object lista. =Sort()=
  • =Queue=: FIFO sor. =Count=, =Enqueue()=, =Dequeue()=, =Peek()=
  • =Stack=: LIFO sor. =Count=, =Push()=, =Pop()=, =Peek()=
  • =HashTable=:
    DictionaryEntry
    -ket tárol (object-object párok). Saját típusnál

felül kell definiálni a =GetHashValue()= és az =Equals()= metódusokat. Címezhető kulcs és index alapján.

  • =SortedList=: kulcs-érték párokat tárol kulcs szerint rendezett listában
  • =ListDictionary=: olyan dictionary, ami kis (<10) elemszámú kollekcióknál hatékony
  • =HybridDictionary=: =HashTable= és =ListDictionary= közül a gyorsabbikat választja
  • =OrderedDictionary=: Dictionary, ami kulccsal és indexszel is címezhető.

Az elemeket a hozzáadás sorrendjében tárolja.

  • =BitArray=: bitek kollekcióját tárolja kompakt módon. A bitekhez egyesével hozzá lehet férni, a kollekciókkal AND, OR, XOR műveleteket lehet végezni
  • =BitVector32=: intet kezel 32 bites bit tömbként, a biteken =CreateMask()= hívásokkal végig

lehet iterálni. Paraméter nélkül az LSB-re ad maszkot, 1 paraméterrel a kapott maszkot shifteli eggyel balra.

  • =BitVector32.Section=: kicsi egészeket csomagol össze egy
    Int32
    -ben. Példa:
// az alsó 4 bitre [0,10] intervallumba eső egészek kerülhetnek
BitVector32.Section firstSection = BitVector32.CreateSection(10);
// a 4-9. bitre [0,50] intervallumba eső egészek kerülhetnek
BitVector32.Section secondSection = BitVector32.CreateSection(50, firstSection);

BitVector32 packedBits = new BitVector32(10);
packedBits[firstSection] = 10;
packedBits[secondSection] = 1;
	  
  • =NameValueCollection=: string-string multimap. A =GetValues()= metódussal le lehet kérni az

egy kulcshoz tartozó értékeket.

  • =StringCollection=, =StringDictionary=: objectek helyett stringeket tárol

Case-insensitive kollekciók létrehozása

  • =Hashtable inTable = CollectionsUtil.CreateCaseInsensitiveHashtable();=
    vagy
public class InsensitiveComparer : IEqualityComparer {
	 CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer();

	 public int GetHashCode(object obj) {
		  return obj.ToString().ToLowerInvariant().GetHashCode();
	 }

	 public new bool Equals(object x, object y) {
		  return _comparer.Compare(x, y) == 0;
	 }
}

Hashtable dehash = new Hashtable(new InsensitiveComparer());
	  
  • =SortedList inList = CollectionsUtil.CreateCaseInsensitiveSortedList();=

Generikus gyűjtemények

Gyorsabb, mint a sima kollekciók, és fordítás idejű típusellenőrzés van.

  • =List<T>=: egyszerű generikus lista
  • =Stack<T>=, =Queue<T>=: LIFO és FIFO sor
  • =SortedList<K, V>=: rendezett lista
  • =Dictionary<K, V>=: hash tábla. Elemeit
    KeyValuePair<K, V>
    -k.
  • =SortedDictionary<K, V>=: bináris keresőfa
  • =LinkedList<T>=: láncolt lista. Nincs nemgenerikus változata.
    • =AddFirst=, =AddLast=, =AddBefore=, =AddAfter=: =LinkedListNode<T>= beszúrása
    • =First=, =Last=, =Prev=, =Next=: első/utolsó/előző/következő =LinkedListNode<T>=
    • A =foreach= a =T= típusú értékeket adja vissza, nem a node-okat.

Saját gyűjtemény létrehozása

.NET 1.1-ben gyakran kellett saját gyűjteményt létrehozni, hogy biztosítsuk az erős típusosságot. .NET 2.0-ban a generikus gyűjtemények miatt már ritkábban van rá szükség.

Interfészek implementálásával

  • =ICollection=
  • =IList=
  • =IDictionary=

Leszármaztatással kevesebb munka

  • =CollectionBase : IList, IEnumerable, ICollection=, egyszerű kollekciókhoz
  • =ReadOnlyCollectionBase : IList, IEnumerable, ICollection=, nincsenek módosító metódusok és setterek
  • =DictionaryBase : IDictionary, IEnumerable, ICollection=

-- Peti - 2007.06.27.