C#Linq List <string> takewhile

时间:2015-08-07 15:42:04

标签: c# linq list

请查看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;应该回来。为什么不呢?

6 个答案:

答案 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);