문제

C#의 컬렉션의 하위 집합만을 통해 열거하는 좋은 방법이 있습니까? 즉, 많은 객체 모음 (예 : 1000)이 있지만 요소 250-340 만 열거하고 싶습니다. 컬렉션의 하위 집합을위한 열거자를 얻는 좋은 방법이 있습니까? 다른 컬렉션 사용?

편집 : 이것이 .NET Framework 2.0을 사용하고 있다고 언급 했어야합니다.

도움이 되었습니까?

해결책

다음을 시도하십시오

var col = GetTheCollection();
var subset = col.Skip(250).Take(90);

또는 더 일반적으로

public static IEnumerable<T> GetRange(this IEnumerable<T> source, int start, int end) {
  // Error checking removed
  return source.Skip(start).Take(end - start);
}

편집하다 2.0 솔루션

public static IEnumerable<T> GetRange<T>(IEnumerable<T> source, int start, int end ) {
  using ( var e = source.GetEnumerator() ){ 
    var i = 0;
    while ( i < start && e.MoveNext() ) { i++; }
    while ( i < end && e.MoveNext() ) { 
      yield return e.Current;
      i++;
    }
  }      
}

IEnumerable<Foo> col = GetTheCollection();
IEnumerable<Foo> range = GetRange(col, 250, 340);

다른 팁

나는 그것을 간단하게 유지하고 싶습니다 (반드시 열거자를 필요로하지 않는다면) :

for (int i = 249; i < Math.Min(340, list.Count); i++)
{
    // do something with list[i]
}

.NET 2.0에 대한 Jared의 원래 코드 적응 :

IEnumerable<T> GetRange(IEnumerable<T> source, int start, int end)
{
    int i = 0;
    foreach (T item in source)
    {
        i++;
        if (i>end) yield break;
        if (i>start) yield return item;
    }
}

그리고 그것을 사용하려면 :

 foreach (T item in GetRange(MyCollection, 250, 340))
 {
     // do something
 }

Jarad의 코드를 다시 한 번 적응하면이 확장 방법이 안건, 색인이 아닙니다.

    //! Get subset of collection between \a start and \a end, inclusive
    //! Usage
    //! \code
    //! using ExtensionMethods;
    //! ...
    //! var subset = MyList.GetRange(firstItem, secondItem);
    //! \endcode
class ExtensionMethods
{
    public static IEnumerable<T> GetRange<T>(this IEnumerable<T> source, T start, T end)
    {
#if DEBUG
        if (source.ToList().IndexOf(start) > source.ToList().IndexOf(end))
            throw new ArgumentException("Start must be earlier in the enumerable than end, or both must be the same");
#endif
        yield return start;

        if (start.Equals(end))
            yield break;                                                    //start == end, so we are finished here

        using (var e = source.GetEnumerator())
        { 
            while (e.MoveNext() && !e.Current.Equals(start));               //skip until start                
            while (!e.Current.Equals(end) && e.MoveNext())                  //return items between start and end
                yield return e.Current;
        }
    }
}

LINQ로 무언가를 할 수 있습니다. 이 작업을 수행하는 방법은 객체를 배열에 넣는 것입니다. 그러면 배열 ID를 기반으로 처리 할 항목을 선택할 수 있습니다.

목록과 컬렉션의 상당한 양의 슬라이싱 및 다이 싱을해야한다면 학습 곡선을 등반하는 것이 좋습니다. C5 Generic Collection 라이브러리.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top