29 Mart 2018 Perşembe

IEnumerable Arayüzü

Kendi Yapımız
C# dünyasında iterator IEnumerable ile sağlanıyor. Bir çok veri yapısı zaten IEnumerable arayüzünden kalıttığı için rahatça kullanılabilir. Eğer kendi yapımızı kalıtmak istersek şöyle yaparız.

GetEnumerator metodu
GetEnumerator metodu hem generic tip hem de generic olmayan (geriye uyumluluk) iki imza ile gerçekleştirilmeli.
public class Simulation : IEnumerable<string>
{
  private IEnumerable<string> Events()
  {
    yield return "a";
    yield return "b";
  }

  public IEnumerator<string> GetEnumerator()
  {
    return Events().GetEnumerator();
  }

  IEnumerator IEnumerable.GetEnumerator()
  {
    return GetEnumerator();
  }
}
Diğer
IEnumerable Java Stream'lerinden farklı olarak tekrar kullanılabilir. Elimizde şöyle bir kod olsun.
Bu kodda listeyi oluşturmak için IEnumerable dolaşılır. originalColleciton.Count() ile bir kere  daha dolaşılır. originalColleciton.Single() için bir kere daha dolaşılır. Her seferinden Yeni Guid'ye sahip Record oluşturulur. Bu yüzden ContainsTheSameSingleObject false döner.
IEnumerable<Record> originalCollection = GenerateRecords(new[] {"Jesse"});
var newCollection = new List<Record>(originalCollection);//1. iteration

Console.WriteLine(ContainTheSameSingleObject(originalCollection, newCollection));


private static IEnumerable<Record> GenerateRecords(string[] listOfNames)
{
  return listOfNames.Select(x => new Record(Guid.NewGuid(), x));
}

private static bool ContainTheSameSingleObject(IEnumerable<Record>
            originalCollection, List<Record> newCollection)
{
  return originalCollection.Count() == 1 && newCollection.Count() == 1 && //2. iteration
         originalCollection.Single().Id == newCollection.Single().Id; //3. iteration
}

private class Record
{
  public Guid Id { get; }
  public string SomeValue { get; }

  public Record(Guid id, string someValue)
  {
    Id = id;
    SomeValue = someValue;
  }
}
Java 8 Streams are not like C# enumerables yazısında benzer bir açıklama var.

Hiç yorum yok:

Yorum Gönder