7 Mayıs 2018 Pazartesi

Array Sınıfı

Giriş
Bu sınıf array olarak kullanılan tüm sınıfların atasıdır. Derleyici otomatik olarak kodladığımız dizileri bu sınıftan kalıtır. Yani şöyle yaparsak bu sınıftan kalıtan bir nesne elde ederiz.
new string[10]
Array Tipi
Eğer array'i ilklendirerek kullanırsak derleyici array'in tipini anlayabilir. Şöyle yaparız. Bu durumda new anahtar kelimesinden sonra int yazmaya gerek yoktur.
int[] num1 = new [] {1, 2, 3, 4};
Eğer array'i ilkendirmiyorsak new kelimesinden sonra int yazmak gerekir. Şöyle yaparız.
int[] num = new int[5];
Kalıtım ve Attribute'lar
Şöyledir.
[SerializableAttribute]
[ComVisibleAttribute(true)]
public abstract class Array : ICloneable, IList, ICollection, 
    IEnumerable, IStructuralComparable, IStructuralEquatable
SerializableAttribute
Bu sınıf Serializable özelliğini destekler. Şöyle yaparız.
Console.WriteLine (new string[0].GetType().IsSerializable);
Çıktı olarak şunu alırız
True
Aynı şeyi görmek için şöyle yaparız. GetCustomAttributes(false) ile bizim eklemediğimiz özellikleri alırız.
foreach (var a in typeof(string[]).GetCustomAttributes(false)) {
  Console.WriteLine(a); // Prints "System.SerializableAttribute"
}
Clear metodu
String olarak dolu diziyi null ile doldurur.
string[] b2 = {...}
Array.Clear(b2, 0 , b2.Length);
CreateInstance metodu
Şöyle yaparız. Tek boyutlu bir 2 eleman büyüklüğünde dizi yaratır.
var array = Array.CreateInstance(typeof(object), new[] { 2 }, new[] { 0 });
Console.WriteLine(array.GetType());
object[] objArray = (object[]) array; // This is fine
ConvertAll metodu
Nesneleri dönüştürüp yeni bir array döner.
Örnek
Elimizde iki dizi olsun.
int[] items = { 1, 2, 3, 7, 8, 9, 13, 16, 19, 23, 25, 26, 29, 31, 35, 36, 39, 45 };
int[] indices = { 1, 3, 5, 6, 7, 9 };
Şöyle yaparız.
var results = Array.ConvertAll(indices, i => items[i]);
Örnek
Elimizde şöyle bir dizi olsun.
string[] lines = File.ReadAllLines("...")
Bu diziyi int dizine şöyle çeviririz.
int[] result = Array.ConvertAll(lines, str => int.Parse(str));
ConstrainedCopy metodu
Şöyle yaparız.
static byte[] ConcatenateBuffers(params byte[][] list)
{
  int totalLen = 0;
  for (int i = 0; i < list.Length; ++i)
    totalLen += list[i].Length;
  byte[] ret = new byte[totalLen];
  int offset = 0;
  for (int i = 0; i < list.Length; ++i)
  {
    Array.ConstrainedCopy(list[i], 0, ret, offset, list[i].Length);
    offset += list[i].Length;
  }
  return ret;
}
Copy metodu
Belirtilen indeksten başlayarak belirtilen sayı kadar diğer diziye kopyalama yapar. Şöyle yaparız.
double[] values = { 0.245, 0.24, 0.235, 0.22, 0.21, 0.20, ... };  

int start = ...;
int last = ...;
int length = last - start + 1;
double[] newvalues = new double[length];
Array.Copy(values, start, newvalues, 0, length);
CopyTo metodu
Belirtilen indeksten başlayarak diğer diziye kopyalama yapar.
string[] lines = ...;
if (lines.Length > 0)
{
  string[] tags = new Array[lines.Length];
  lines.CopyTo(tags,0);
}
FindAll
Şöyle yaparız. Başka bir array döner.
int[] list = { 1, 2, 3, 4, 5 };

List<int> evenList = Array.FindAll(list, elem => elem % 2 == 0).ToList();
IndexOf  metodu
Örnek
Şöyle yaparız.
double[] values = { 0.245, 0.24, 0.235, 0.22, 0.21, 0.20, ... };   
double criteria = 0.75;
int start = Array.IndexOf(values, criteria);
LastIndexOf metodu
Eğer son değeri bulmak istersek şöyle yaparız.
int last = Array.LastIndexOf(expiry, criteria);
Length metodu
Array sınıfının büyüklüğü Length alanı ile bulunur. Diğer veriyapılarında ise büyüklüğü bulmak için Count alanı kullanılır. Array'ın farklı olduğunu belirtmek için böyle yapılmış.

Resize metodu
Açıklaması şöyle
If newSize is greater than the Length of the old array, a new array is allocated and all the elements are copied from the old array to the new one.
If newSize is less than the Length of the old array, a new array is allocated and elements are copied from the old array to the new one until the new one is filled; the rest of the elements in the old array are ignored.
Reverse metodu
Diziyi ters çevirir. Girdi olarak verilen dizi değiştirilir. Şöyle yaparız.
string[] text = ...
Array.Reverse(text); // reverse supplied array
İstersek Linq ile de aynı şeyi kolayca yapabiliriz. Tek fark sonucu farklı bir dizi içinde elde etmemiz.
int[] array = {1,3};
var reversedArray = array.Reverse().ToArray();
Sort metodu
Şöyle yaparız.
string[] lines = ...;
Array.Sort(lines);
ToList metodu
Array çok kolay List nesnesine çevrilebilir.
int[] list = { 1, 2, 3, 4, 5 };

List<int> evenList = Array.FindAll(list, elem => elem % 2 == 0).ToList();
Aynı şekilde List nesnesi Array nesnesine çok kolay çevrilebilir.
Array[] ar = list.Select(x => ...).ToArray();
Diğer

jagged Array Tanımlama
Açıklaması şöyle.
The elements of a jagged array can be of different dimensions and sizes.
Şöyle yaparız.
int[][] array = new int[3][n]; 
Aynı şeyi Java'da şöyle yaparız.
ArrayList<ArrayList<Integer>> seq = new ArrayList<ArrayList<Integer>>(); 
Örnek
İki boyutlu array'den jagged array'e dönüşüm için  şöyle yaparız.
public static class ArrayExtensions
{
  public static T[][] ToJagged<T>(this T[,] value)
  {
    T[][] result = new T[value.GetLength(0)][];

    for (int i = 0; i < value.GetLength(0); ++i)
      result[i] = new T[value.GetLength(1)];

    for (int i = 0; i < value.GetLength(0); ++i)
      for (int j = 0; j < value.GetLength(1); ++j)
        result[i][j] = value[i, j];

    return result;
  }
}
Örnek
jagged array'i parametre olarak geçmek için şöyle yaparız.
public void  AddNodes(params T[][] nodes)
{
  ...;
}

İki Boyutlu Array Tanımlama
Şöyle tanımlanır
int[ , ] arrayName = new int[10,10];
Boyutları sonradan hesaplayıp verebilmek te mümkün
public class Foo
{
  private int[ , ] Bar;  // Bar will be null until initialized

  public Foo(int a, int b)
  {
    Bar = new int[a, b];
  }
}
İki boyutlu generic array şöyle kullanılır. Bu sefer int yerine T geliyor.
public sealed class Array2D<T>
{
  private T[,] _fields;

  //Or as property
  public T[,] Fields
  {
    get { return _fields; }
    set { _fields = value; }
  }

  public Array2D()
  {

  }
}
Array şöyle doldurulur.
Array2D<int> arr = new Array2D<int> {Fields = new[,] {{1, 2}, {3, 4}, {5, 6} }};


Hiç yorum yok:

Yorum Gönder