2011-08-11 2 views

답변

3

나는 순간에 어떤 생각할 수 없다, 그러나 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을 전달합니다. 게으른 평가로 인해 오버 헤드가 없어야합니다.

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

람다 식을 사용하여 목록을 서브 세트로 사용하는 것과 같지 않습니까? 다음

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(); 
관련 문제