는 언제 나는 같은 것을 할 항목 중 일부 범위를 처리 할 : 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);
있는가 게다가?
나는 순간에 어떤 생각할 수 없다, 그러나 LINQ를 사용하면 쉽게 컬렉션의 일부를 나타내는 IEnumerable<T>
을 만들 수 있습니다.
제가 알기에 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);
}
람다 식을 사용하여 목록을 서브 세트로 사용하는 것과 같지 않습니까? 다음
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();