2011-08-11 9 views
5

は、いつでも私は、このような何かを項目のいくつかの範囲を処理したい:のSystem.Arrayのためではなく、他のコレクションクラスのためだけでなく、C#でこれを行うには、このような便利な方法はコレクションのサブセットをC#メソッドに渡すにはどうすればいいですか? C++で

template<class Iterator> 
void method(Iterator range_begin, Iterator range_end); 

あります同じように?

答えて

3

私は、現時点では任意のものと思いますが、簡単にあなたのコレクションの一部を表すIEnumerable<T>を作成することができますLINQを使用することはできません。

私が理解しているように、C#の方法はコレクションの一部をコレクション自体として見て、methodをこのシーケンスで動作させることです。このアイデアは、メソッドがコレクション全体またはその一部で動作しているかどうかを無知にすることを可能にします。

例:

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); 

など

はC++にこれを比較し: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++ 

を、あなたのコードは周りにそれらを渡すためにイテレータを計算し、先頭をマークし、あなたのシーケンスの終わり。 C#では軽量のIEnumerableを渡します。怠惰な評価のために、これにオーバーヘッドはありません。

4

LINQを使用している場合は、SkipTakeをご覧ください。

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

あなたのリストをサブセット化するためにLAMBDA式を使用するのと同じではありませんか?その後、

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); 

またはあなたが与えられた引数なしのコレクションでnアイテムを処理したい場合は、データベースに同じようskip()take()を使用することができます。

1

IEnumerable <>を使用して、値をLINQクエリとして渡すことができますか?

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

使用しているコレクションの種類によって異なります。あるものは他のものよりも能力があります。リストを使用すると、次のようなことができます:

List<string> lst = new List<string>(); 
lst = lst.Where(str => str == "Harry" || str == "John" || str == "Joey").ToList(); 
関連する問題