c#,Linq,选择和计数

时间:2015-09-22 08:48:25

标签: c# linq select lambda count

我正在学习c#。下面的代码打印出5.我对Select如何工作很困惑。由于序列1中的第2和第3个字比序列2中的对应字短,所以结果不应该是2吗?有人可以帮忙解释一下吗?提前谢谢了!

string[] seq1 = { "jumps", "over", "pop", "milk", "egg", }; 
string[] seq2 = { "jam", "dizzy", "fuzzy", "the" };
var count = seq1.Select( n1 => seq2.Where(n2 => n1.Length < n2.Length) ) .Count();

4 个答案:

答案 0 :(得分:3)

您的代码执行此操作:

对于序列1中的每个项目,选择

seq1.Select( n1 => 

序列2元素的集合,它比后续的1元素短。

seq2.Where(n2 => n1.Length < n2.Length)

然后计算你拥有的序列2集合的数量(即每个序列1元素5 - 1)

) .Count();

答案 1 :(得分:2)

没有。使用seq2.Where(n2 => n1.Length < n2.Length)可以过滤比较大小的元素,但使用seq1.Select(...)可以为seq1的每个元素执行此操作。通过这个,您可以获得列表清单。 Select()函数是投影而不是过滤器。

在您的示例中,结果如下: `

n1 =“jumps”=&gt; [],

n1 =“over”=&gt; [“头晕目眩”,“模糊”],

n1 =“pop”=&gt; [“头晕目眩”,“模糊”],

n1 =“milk”=&gt; [“头晕目眩”,“模糊”],

n1 =“egg”=&gt; [“头晕”,“模糊”]`

如您所见,您有5个元素,每个元素包含来自seq2的部分。

答案 2 :(得分:1)

首先,Select不会像Where那样过滤输入序列。这就是为什么你得到5的结果。数组seq1包含5个字,您可以从此数组中进行选择。选择的内容并不重要,因为 - 如前所述 - Select不会过滤。

您可以使用:

int count = seq1
    .Where((n1, index1) => seq2.Length > index1 && n1.Length < seq2[index1].Length)
    .Count();

以下是使用Zip + Sum

的不同方法
int count = seq1.Zip(seq2, (n1, n2) => n1.Length < n2.Length ? 1 : 0).Sum();

答案 3 :(得分:0)

它会计算apiProject中的所有元素(因此它就像scala> object MyObject { | | def isEven(xs: List[Int]): TailRec[Boolean] = | if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail)) | | def isOdd(xs: List[Int]): TailRec[Boolean] = | if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail)) | | isEven((1 to 100000).toList).result | | def fib(n: Int): TailRec[Int] = | if (n < 2) done(n) else for { | x <- tailcall(fib(n - 1)) | y <- tailcall(fib(n - 2)) | } yield (x + y) | } defined object MyObject scala> MyObject.fib(40).result res5: Int = 102334155

这是你的de-Linq-ued代码:

seq1

来自seq1.Count()的代码string[] seq1 = { "jumps", "over", "pop", "milk", "egg", }; string[] seq2 = { "jam", "dizzy", "fuzzy", "the" }; var count = 0; foreach (string n1 in seq1) { IEnumerable<string> enumerable = seq2.Where(n2 => n1.Length < n2.Length); count++; } 项目比Selects中的当前元素短,但对它们没有任何作用。实现比较&#34;对应&#34;项目,您可以运行此代码段

seq2

它会检查&#34;对应的&#34;项目在第二个序列中更长

编辑:

更改为seq会使其遍历seq2

string[] seq1 = { "jumps", "over", "pop", "milk", "egg", };
string[] seq2 = { "jam", "dizzy", "fuzzy", "the" };

int count = 0;
for (int i = 0; i < Math.Min(seq1.Length,seq2.Length); i++)
{
    if (seq1[i].Length < seq2.Length) count++;
}