C#如何执行压缩操作与 null 数组

标签: Linq C#
发布时间: 2017/2/27 4:27:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正尝试在 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);
}

什么是适当的方式,以避免 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 });


光突发交换︰ 我实际上正在与 Directory.EnumerateDirectoriesDirectory.EnumerateFiles 而不是 int[]string[]

解决方法 1:

以下是有点难看,但您可以使用 null 合并运算符 ?? 像这样︰

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

或创建扩展方法同样这么做 (你可能想要想出更好的名字,比 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 });
赞助商