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.
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.
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