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 的部分。