0

我想将一个集合的一部分提取到另一个集合。我可以使用 for 循环轻松地做同样的事情,但我的 linq 查询不适用于相同的工作。我是 Linq 的新手,所以请帮我更正查询(如果可能,请提供解释/初学者教程链接)

传统的做法:

Collection<string> testColl1 = new Collection<string> {"t1", "t2", "t3", "t4"};
Collection<string> testColl2 = new Collection<string>();

for (int i = 0; i < newLength; i++)
{
    testColl2.Add(testColl1[i]);
}

其中 testColl1 是源,而 testColl2 是所需的 count = newLength 截断集合。

我使用了以下 linq 查询,但它们都没有工作......

var result = from t in testColl1 where t.Count() <= newLength select t;
            var res = testColl1.Where(t => t.Count() <= newLength);
4

4 回答 4

3

使用Enumerable.Take

var testColl2 = testColl1.Take(newLength).ToList();

请注意,您的for循环和使用Take. 如果 中的项目少于,则for循环将抛出异常,而版本将默默地忽略这一事实,并仅返回与项目一样多的项目。IndexOutOfRangeExceptionnewLengthtestColl1TakenewLength

于 2012-05-11T13:18:49.093 回答
2

正确的方法是使用Take

var result = testColl1.Take(newLength);

等效的使用方式Where是:

var result = testColl1.Where((i, item) => i < newLength);

这些表达式将产生一个IEnumerable,因此您可能还想在末尾附加一个.ToList()or 。.ToArray()

两种方式都比您的原始实现少返回一个项目,因为它更自然(例如,如果newLength == 0不应该返回任何项目)。

于 2012-05-11T13:18:40.737 回答
1

您可以将for循环转换为如下内容:

testColl1.Take(newLength)
于 2012-05-11T13:18:49.153 回答
1

使用Take

var result = testColl1.Take(newLength);

此扩展方法返回集合中的前 N ​​个元素,其中 N 是您传递的参数,在本例中为newLength.

于 2012-05-11T13:19:17.080 回答