我正在尝试使用C#中的Zip操作,如here所述。考虑此代码段:
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 });
Obs:我实际上与Directory.EnumerateDirectories
和Directory.EnumerateFiles
合作,而不是int[]
和string[]
。
答案 0 :(得分:3)
以下有点难看,但您可以像这样使用空合并运算符??
:
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 });
答案 1 :(得分:0)
Zip
对于处理空序列不是很有用,因为它将返回空序列(它返回基于较短长度的序列)。你也可以检查一下:
var result = numbers == null || words==null ?
Enumerable.Repeat(new { Number = 0, Word = "" },0) :
numbers.Zip(words, (n, w) => new { Number = n, Word = w });
根据您的可能用法,我看不到Zip
目录和文件如何有用(忽略痛苦的“拒绝访问”和其他IO异常)。可能你想要一个文件列表和父目录。下面的近似代码(获取每个目录的所有文件,将每个文件与目录信息配对,展平):
var directories = ....
var filesAndDir = directories
.Select(dir => Directory.EnumerateFiles(dir).Select{file => new {dir, file})
.SelectMany(r=>r);