如何将集合的子集传递给c#方法

本文关键字:方法 子集 集合 | 更新日期: 2023-09-27 18:05:10

在c++中,每当我想处理某个范围的项时,我都会这样做:

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

在c#中是否有这样一种方便的方法来做到这一点,不仅对于System.Array,而且对于其他集合类也是如此?

如何将集合的子集传递给c#方法

// ...
using System.Linq;
IEnumerable<T> GetSubset<T>( IEnumerable<T> collection, int start, int len )
{
    // error checking if desired
    return collection.Skip( start ).Take( len );
}

我现在想不起来,但是使用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++比较:

// 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++中,你的代码计算迭代器是为了传递它们,并标记序列的开始和结束。在c#中,您可以传递轻量级的IEnumerable

如果您使用LINQ,请查看SkipTake

您是否可以使用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);

这与使用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);

或者您可以使用skip()take(),就像在数据库中一样,如果您想处理集合中的n项而不需要给定参数。

这取决于您使用的是哪种集合。有些人比其他人更有能力。使用列表,您可以这样做:

List<string> lst = new List<string>();
lst = lst.Where(str => str == "Harry" || str == "John" || str == "Joey").ToList();