请查看Linqpad中的以下代码,并告诉我为什么它会返回0项而不是1项。
void Main()
{
string[] strArray = {"apple", "banana", "cherry", "e"};
List<string> lst = strArray.ToList();
//count all occurences of variable alphabet "e" in LINQ
//tip is to get the occurences of letter "e" in each word
// and then total them together
var lst2 = lst.TakeWhile(c=>c.Equals("banana")).Select(c=>c);
Console.WriteLine(lst2);
}
上面的代码没有像我预期的那样在linqpad中返回1个项目。相反,它返回0项。列表中包含1个项目&#34; banana&#34;应该回来。为什么不呢?
答案 0 :(得分:11)
TakeWhile
的文档:
只要指定的条件为真,就返回序列中的元素。
由于订购了List
,因此第一项“apple”不等于“banana”。条件为false,TakeWhile
在到达“banana”项目之前退出。
您可能希望使用Where
方法
根据谓词过滤一系列值。
答案 1 :(得分:3)
@arcyqwerty解释了为什么你得到你的结果。对于您的预期结果,请在此实例中使用Where
:
var lst2 = lst.Where(c=>c.Equals("banana"));
此外,不需要Select(c => c)
,这是多余的。
答案 2 :(得分:2)
因为它是而迭代项是香蕉,因为它到达的第一个项目不是香蕉,它会停止迭代。
答案 3 :(得分:1)
这将返回1个项目(&#34; banana&#34;):
var result = lst.Where(c => c.Equals("banana")).ToList();
Console.WriteLine(result);
正如其他人所指出的,不需要TakeWhile
只需要简单的Where
即可。
编辑:从您的代码评论中,您可能会尝试计算“&#39; e”的出现次数。在源列表中。这将为您做到这一点:
var list = new List<string> { "apple", "banana", "cherry", "e" };
var count = list
.SelectMany(x => x.ToArray()) // flatten into list of chars
.Where(x => x.Equals('e'))
.Count();
Console.Write(count);
答案 4 :(得分:1)
只要条件为真,TakeWhile
将获取元素。在你的情况下,它在开始时是错误的,因为它评估if ("apple" == "banana")
而不是TakeWhile
停止。
如果你把元素&#34;香蕉&#34;一开始,它会起作用。
string[] strArray = {"banana", "apple", "cherry", "e"};
另外,你只能写。
var lst2 = lst.TakeWhile(c=>c.Equals("banana"))
选择没用。
答案 5 :(得分:0)
arcyqwerty告诉你原因。他遗漏了你想要的东西:
var lst2 = lst.Where(c=>c.Equals("banana")).Select(c=>c);