我正在学习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();
答案 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++;
}