2011-08-11 11 views

cevap

3

Ben şu anda herhangi düşünemiyorum ama LINQ kullanarak kolayca koleksiyonunun bir kısmını temsil eden bir IEnumerable<T> oluşturabilir.

Anladığım kadarıyla, C# yolu, koleksiyonun bir parçasını koleksiyonun kendisi olarak görmek ve method ürününüzün bu sıra üzerinde çalışmasını sağlamaktır. Bu fikir, yöntemin tüm koleksiyonda veya onun parçası üzerinde çalışıp çalışmadığına dair cahil olmasını sağlar.

Örnekler:

void method(IEnumerable<T> collection) 
{ ... } 

// from 2-nd to 5-th item: 
method(original.Skip(1).Take(4)); 
// all even items: 
method(original.Where(x => x % 2 == 0)); 
// everything till the first 0 
method(original.TakeWhile(x => x != 0)); 
// everything 
method(original); 

vb

C++ ile karşılaştırın: kodunuzu etrafında geçmek için iterators hesaplar, C++

// from 2-nd to 5-th item: 
method(original.begin() + 1, original.begin() + 5); 
// everything 
method(original.begin(), original.end()); 
// other two cannot be coded in this style in C++ 

ve başlangıcını işaretlemek ve sıranın sonu. C# 'da hafif IEnumerable s geçersiniz. Tembel değerlendirme nedeniyle bunun hiçbir yükü olmamalıdır.

4

LINQ kullanıyorsanız, Skip ve Take'a bakın.

7
// ... 
using System.Linq; 

IEnumerable<T> GetSubset<T>(IEnumerable<T> collection, int start, int len) 
{ 
    // error checking if desired 
    return collection.Skip(start).Take(len); 
} 
0

Bu, listenizi almak için LAMBDA ifadesini kullanmakla aynı olmaz mı? Sonra

public myClass { 
    public int Year { get; set; } 
    ... 
} 

...

List<myClass> allClasses = db.GetClasses(); 
IEnumerable<myClass> subsetClasses = allClasses.where(x => x.Year >= 1990 && x.Year <= 2000); 

processSubset(subsetClasses); 

veya belirli bir argüman olmadan koleksiyonunda n öğeleri işlemek istiyorsanız bir veritabanında gibi skip() ve take() kullanabilirsiniz.

1

IEnumerable <> 'ı kullanabilir ve değerlerinizi LINQ sorgusu olarak geçirebilir misiniz?

void MyMethod<T>(IEnumerable<T> workSet) { 
    foreach (var workItem in workSet) { 
     doWorkWithItem(workItem); 
    } 
} 

var dataset = yourArray.SkipWhile(i=>i!=startItem).TakeWhile(i=>i!=endItem); 
MyMethod(dataset); 

var pagedSet = yourArray.Skip(pageSize * pageNumber).Take(pageSize); 
MyMethod(pagedSet); 
0

Kullandığınız koleksiyona göre değişir. Bazılarının diğerlerinden daha fazla yetenekleri var. Bir liste kullanarak aşağıdaki gibi bir şey yapabilirsiniz:

List<string> lst = new List<string>(); 
lst = lst.Where(str => str == "Harry" || str == "John" || str == "Joey").ToList(); 
İlgili konular