は、いつでも私は、このような何かを項目のいくつかの範囲を処理したい:のSystem.Arrayのためではなく、他のコレクションクラスのためだけでなく、C#でこれを行うには、このような便利な方法はコレクションのサブセットをC#メソッドに渡すにはどうすればいいですか? C++で
template<class Iterator>
void method(Iterator range_begin, Iterator range_end);
あります同じように?
は、いつでも私は、このような何かを項目のいくつかの範囲を処理したい:のSystem.Arrayのためではなく、他のコレクションクラスのためだけでなく、C#でこれを行うには、このような便利な方法はコレクションのサブセットをC#メソッドに渡すにはどうすればいいですか? C++で
template<class Iterator>
void method(Iterator range_begin, Iterator range_end);
あります同じように?
私は、現時点では任意のものと思いますが、簡単にあなたのコレクションの一部を表す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
を渡します。怠惰な評価のために、これにオーバーヘッドはありません。
LINQを使用している場合は、Skip
とTake
をご覧ください。
// ...
using System.Linq;
IEnumerable<T> GetSubset<T>(IEnumerable<T> collection, int start, int len)
{
// error checking if desired
return collection.Skip(start).Take(len);
}
あなたのリストをサブセット化するために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()
を使用することができます。
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);
使用しているコレクションの種類によって異なります。あるものは他のものよりも能力があります。リストを使用すると、次のようなことができます:
List<string> lst = new List<string>();
lst = lst.Where(str => str == "Harry" || str == "John" || str == "Joey").ToList();