2 Eylül 2018 Pazar

Dictionary Sınıfı

Giriş
Şu satırı dahil ederiz.
using System.Collections.Generic;
Bu sınıfa benzer işlevler sağlayan diğer sınıflar ConcurrentDictionary ve SortedDictionary sınıfları. Ayrıca HashTable sınıfı da benzer işlev sağlar.

Bir çok thread sadece okumak için kullanıyorsa sorun olmuyor. Açıklaması şöyle
A Dictionary can support multiple readers concurrently, as long as the collection is not modified. Even so, enumerating through a collection is intrinsically not a thread-safe procedure. In the rare case where an enumeration contends with write accesses, the collection must be locked during the entire enumeration. To allow the collection to be accessed by multiple threads for reading and writing, you must implement your own synchronization.
KeyValuePair Yapısı
Dictionary sınıfı KeyValuePair yapısı ile bütünleşiktir. Bu yapının Key ve Value isimli iki alanı vardır. Tüm veri yapısı şöyle dolaşılır.
Dictionary<string, int> dict = new Dictionary<string, int>();
foreach (KeyValuePair<string, int> item in dict) {
  int i = item.Value;
}
Key Alanı
Değiştirilemez. Aşağıdaki kod hata verir.
KeyValuePair<string,string> kvp = ...;
kvp["..."] = "...";
Şu hatayı alırız.
Cannot apply indexing with [] to an expression of type System.Collections.Generic.KeyValuePair'
Dictionary Sınıfı
KeyValuePair yapısına baktıktan sonra detaylara inelim.

Alanlar
Count Alanı
Şöyle yaparız.
dic.Count
Keys Alanı
Şöyle yaparız.
var keys = dic.Keys.OrderByDescending(o => o).ToList();
Values Alanı
Şöyle yaparız. Linq ile de kullanılabilir.
dic.Values.First(); 
Metodlar
Constructor
Şöyle yaparız.
Dictionary<string, double> dic = new Dictionary<string,double>();
Constructor - IEqualityComparer
Örnek
Key string olduğu için şöyle yaparız.
var dic = new Dictionary<string, double>(StringComparer.OrdinalIgnoreCase);
Örnek
Şöyle yaparız.
public class CustomEqualityComparer : IEqualityComparer<Foo>
{
  public new bool Equals(Foo x, Foo y)
  {
    ...
    return false;
  }

  public int GetHashCode(Foo obj)
  {
    ...
    return obj.GetHashCode();
  }
}
Şöyle yaparız.
var dictionary = new Dictionary<Foo, String>(new CustomEqualityComparer());
Add metodu
Şöyle yaparız.
_dQuote.Add("key1", 1.1);
Bracket operator
Key değerinin mevcut olduğundan eminsek şöyle yaparız.
var key = ...;
var val = dic[key];
Clear metodu
Şöyle yaparız.
dic.Clear();
ContainsKey metodu
Şöyle yaparız.
if (dic.ContainsKey("...")) {...}
FirstOrDefault Metodu
Elimizde şöyle bir yapı olsun.
Dictionary<int, string> dic = new Dictionary<int, string>();
Value olarak C içeren girdiyi bulmak için şöyle yaparız. Burada key alanı ile arama yapmak yerine, value alanına göre arama yapıyoruz.
var resultItem = dic.FirstOrDefault (x=>x.value=="C");
if(resultItem !=null) //returns default value if no match found
{
   int resultID = resultItem.Key; 
}
Last Metodu
Bir key/value çifti döner. Şöyle yaparız.
Dictionary<string, List<string>> dic = new Dictionary<string, List<string>>();
var obj = dic.Last();
dic.Remove (obj.Key);
Remove Metodu
Belirtilen anahtarı siler.
Örnek
Şöyle yaparız.
var key = ...;
dic.Remove (key);
Örnek
Şöyle yaparız.
public static class DictionaryExtensions
{
  public static bool TryRemove<TKey, TValue>(this IDictionary<TKey, TValue> dict,
    TKey key, out TValue value)
  {
    if (dict.TryGetValue(key, out value))
      return dict.Remove(key);
    else
      return false;
  }
}
TryGetValue metodu
Şöyle yaparız.
string bla;
if (dic.TryGetValue ("...", out bla))
{
  //the key exists
}
else
{
  //the key doesn't exist
}
Şöyle bir extension metod faydalı oluyor.
public static class DictionaryExtensions
{
  public static V ValueOrDefault<K,V>(this IDictionary<K,V> dictionary, T key)
  {
    if (key == null || dictionary == null)
      return default(V);

    V value;
    return dictionary.TryGetValue(key, out value) ? value : default(V);
  }
}
Şöyle kullanırız.
var bla = dic.ValueOrDefault ("...");



Hiç yorum yok:

Yorum Gönder