如何使用空数组执行 Zip 操作

fir*_*mer 4 c# linq arrays iteration loops

我正在尝试使用 C# 中的 Zip 操作,如此处所述。考虑这个代码片段:

int[] numbers = new[] { 1, 2, 3, 4 };
string[] words = new string[] { "one", "two", "three", "four" };

var numbersAndWords = numbers.Zip(words, (n, w) => new { Number = n, Word = w });
foreach (var nw in numbersAndWords)
{
    Console.WriteLine(nw.Number + nw.Word);
}
Run Code Online (Sandbox Code Playgroud)

System.ArgumentNullException如果其中一个组件出现这种情况,避免的正确方法是什么null
例如初始化words为null,像这样

int[] numbers = new[] { 1, 2, 3, 4 };
string[] words = null;

// The next line won't work
var numbersAndWords = numbers.Zip(words, (n, w) => new { Number = n, Word = w });
Run Code Online (Sandbox Code Playgroud)


Obs:我实际上正在使用Directory.EnumerateDirectoriesandDirectory.EnumerateFiles而不是int[]and string[]

Ale*_*lex 5

??下面的代码有点难看,但是您可以像这样使用空合并运算符:

var numbersAndWords = 
  (numbers ?? Enumerable.Empty<int>()).Zip(
        (words ?? Enumerable.Empty<string>()), 
        (n, w) => new { Number = n, Word = w });
Run Code Online (Sandbox Code Playgroud)

或者创建一个具有相同功能的扩展方法(您可能想想一个比 更好的名称OrEmpty):

public static class MyEnumerableExtensions
{
    public static IEnumerable<T> OrEmpty<T>(this IEnumerable<T> self)
    {
        return self ?? Enumerable.Empty<T>();
    }
}

var numbersAndWords = numbers.OrEmpty()
    .Zip(words.OrEmpty(), (n, w) => new { Number = n, Word = w });
Run Code Online (Sandbox Code Playgroud)