c#、Linq、Select 和计数
c# , Linq, Select and Count
我正在学习 C#。以下代码打印出 5。我对 Select 的工作原理感到很困惑。结果不应该是 2,因为序列 1 中的第二个和第三个单词比序列 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();
它计算来自 seq1
的所有元素(所以它就像 seq1.Count()
这是你的 de-Linq-ued 代码:
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
来自 seq2
的项目比来自 seq
的当前元素短,但对它们没有任何作用。要比较 "corresponding" 项,您可以 运行 此代码段
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++;
}
它将检查 "corresponding" 个项目在第二个序列中是否更长
编辑:
更改为 SelectMany
也会使其遍历 seq2
foreach (string n1 in seq1)
foreach (string s in seq2.Where(n2 => n1.Length < n2.Length))
count++;
首先,Select
doesn't filter the input sequence like Where
。这就是为什么你得到 5 作为结果。数组 seq1
包含 5 个单词,您正在从这个数组中 selecting。 select 是什么并不重要,因为 - 如前所述 - 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();
您的代码执行此操作:
对于后续 1 中的每一项,select
seq1.Select( n1 =>
比后续 1 元素短的序列 2 元素的集合。
seq2.Where(n2 => n1.Length < n2.Length)
然后计算您拥有的序列 2 集合的数量(即 5 - 每个序列 1 元素一个)
) .Count();
没有。使用 seq2.Where(n2 => n1.Length < n2.Length)
可以过滤比较大小的元素,但是使用 seq1.Select(...)
可以对 seq1 的每个元素执行此操作。有了这个,你会得到一个列表列表。 Select()
函数是投影而不是过滤器。
在您的示例中,结果如下:
`
n1 = "jumps" => [],
n1 = "over" => ["dizzy", "fuzzy"],
n1 = "pop" => ["dizzy", "fuzzy"],
n1 = "milk" => ["dizzy", "fuzzy"],
n1 = "egg" => ["dizzy", "fuzzy"]`
如您所见,您有 5 个元素,每个元素都包含来自 seq2 的部分。
我正在学习 C#。以下代码打印出 5。我对 Select 的工作原理感到很困惑。结果不应该是 2,因为序列 1 中的第二个和第三个单词比序列 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();
它计算来自 seq1
的所有元素(所以它就像 seq1.Count()
这是你的 de-Linq-ued 代码:
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
来自 seq2
的项目比来自 seq
的当前元素短,但对它们没有任何作用。要比较 "corresponding" 项,您可以 运行 此代码段
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++;
}
它将检查 "corresponding" 个项目在第二个序列中是否更长
编辑:
更改为 SelectMany
也会使其遍历 seq2
foreach (string n1 in seq1)
foreach (string s in seq2.Where(n2 => n1.Length < n2.Length))
count++;
首先,Select
doesn't filter the input sequence like Where
。这就是为什么你得到 5 作为结果。数组 seq1
包含 5 个单词,您正在从这个数组中 selecting。 select 是什么并不重要,因为 - 如前所述 - 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();
您的代码执行此操作:
对于后续 1 中的每一项,select
seq1.Select( n1 =>
比后续 1 元素短的序列 2 元素的集合。
seq2.Where(n2 => n1.Length < n2.Length)
然后计算您拥有的序列 2 集合的数量(即 5 - 每个序列 1 元素一个)
) .Count();
没有。使用 seq2.Where(n2 => n1.Length < n2.Length)
可以过滤比较大小的元素,但是使用 seq1.Select(...)
可以对 seq1 的每个元素执行此操作。有了这个,你会得到一个列表列表。 Select()
函数是投影而不是过滤器。
在您的示例中,结果如下: `
n1 = "jumps" => [],
n1 = "over" => ["dizzy", "fuzzy"],
n1 = "pop" => ["dizzy", "fuzzy"],
n1 = "milk" => ["dizzy", "fuzzy"],
n1 = "egg" => ["dizzy", "fuzzy"]`
如您所见,您有 5 个元素,每个元素都包含来自 seq2 的部分。