使用Linq查询截断集合

使用Linq查询截断集合,linq,lambda,Linq,Lambda,我想将一个集合的一部分提取到另一个集合。 我可以使用for循环轻松地完成同样的操作,但是我的linq查询不适用于相同的环境。 我是Linq的新手,因此请帮助我更正查询(如果可能,请提供解释/初学者教程链接) 传统做法: Collection<string> testColl1 = new Collection<string> {"t1", "t2", "t3", "t4"}; Collection<string> testColl2 = new Collect

我想将一个集合的一部分提取到另一个集合。 我可以使用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]);
}
Collection testColl1=新集合{“t1”、“t2”、“t3”、“t4”};
Collection testColl2=新集合();
for(int i=0;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);

var result=来自testColl1中的t,其中t.Count()t.Count()正确的方法是使用:

使用的等效方法是:

var result=testColl1.其中((i,item)=>i
这些表达式将生成一个
IEnumerable
,因此您可能还希望在末尾附加一个
.ToList()
.ToArray()


这两种方法返回的项都比原始实现少,因为它更自然(例如,如果
newLength==0
则不应返回任何项)。

您可以将
转换为
for
循环,如下所示:

testColl1.Take(newLength)
使用:

请注意,您的
for
循环与使用
Take
的版本之间存在语义差异。如果
testColl1
中的
newLength
项少于
newLength
项,则
for
循环将抛出
IndexOutOfRangeException
异常,而
Take
版本将默认忽略此事实,只返回最多
newLength
项的相同数量的项。

使用:


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

Ya,U是正确的,我错误地使用了+1,因此编辑了我的问题。结尾的ThxAppending.ToList()或.ToArray()对于将IEnumerable转换为集合没有帮助。使用像testColl2=(Collection)testColl1.Take(newLength)这样的函数是否是一种好的实践@比基:你在说什么?您的建议将在运行时抛出。如果您坚持使用
集合的实例(为什么?),则需要说
testColl2=newcollection(testColl1.Take(newLength.ToList())。您不能强制转换
的结果。直接将
转换为
集合
的实例。您必须调用
ToList
并将其传递给
Collection
@Biki:的构造函数,然后将其声明为
IEnumerable
,然后继续。+1用于解释两种方法之间的语义差异;+1用于where等效方法。如果你也能解释where子句,那就太好了。
var result = testColl1.Where((i, item) => i < newLength);
testColl1.Take(newLength)
var testColl2 = testColl1.Take(newLength).ToList();
var result = testColl1.Take(newLength);