如何检查IEnumerable <T>是否以.NET中的另一个IEnumerable <T>启动?

Jam*_* Ko 3 .net c# linq collections ienumerable

我最近遇到了一个场景,我需要检查一下是否IEnumerable<T>有一些IEnumerable<T>前缀.我搜索并没有找到现有的StackOverflow答案,因此我决定以下面的答案形式提供我自己的解决方案.

Tim*_*ter 7

您的扩展程序没问题,但您可以使用现有的Enumerable.Zip+ All:

var longerSeq = new[] { "SOME", "IMPORTANT", "WORDS" };
var shorterSeq = new[] { "some", "important" };

bool startsWithCaseInsensitive = longerSeq 
    .Zip(shorterSeq, (l, s) =>  string.Equals(l, s, StringComparison.OrdinalIgnoreCase))
    .All(b => b);   // are all bools true? Returns false on first false
Run Code Online (Sandbox Code Playgroud)

文件:

该方法将第一序列的每个元素与在第二序列中具有相同索引的元素合并.如果序列没有相同数量的元素,则该方法合并序列,直到它到达其中一个序列的末尾

由于Zip使用延迟执行,如果第一个已经产生,它将不会评估所有false.

  • 但这并不等同于 OP 解决方案。如果“前缀”序列比“源”序列长,则“StartsWith”应返回“false”。哪个`Zip`实现无法区分。 (2认同)