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