【问题标题】:How to perform Zip operation with null array如何使用空数组执行 Zip 操作
【发布时间】:2015-07-14 13:16:00
【问题描述】:

我正在 C# 中试验 Zip 操作,如 here 所述。考虑到这段代码sn-p:

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);
}

如果其中一个组件是null,避免System.ArgumentNullException 的正确方法是什么?
比如初始化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.EnumerateDirectoriesDirectory.EnumerateFiles 而不是 int[]string[]

【问题讨论】:

  • if 语句听起来如何? if (a != null) ...
  • 旁注:由于不可预测的异常,目录/文件通常对 LINQ 不友好...确保您对此感到满意。

标签: c# arrays linq loops iteration


【解决方案1】:

以下内容有点难看,但您可以像这样使用空合并运算符??

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 });

【讨论】:

    【解决方案2】:

    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'ing Directory and Files 会有什么用处(忽略痛苦的“访问被拒绝”和其他 IO 异常)。可能您希望拥有一个文件列表以及父目录。下面的近似代码(获取每个目录的所有文件,将每个文件与目录信息配对,展平):

      var directories = ....
      var filesAndDir = directories
         .Select(dir => Directory.EnumerateFiles(dir).Select{file => new {dir, file})
         .SelectMany(r=>r); 
    

    【讨论】:

    • 例如,我想将所有文件从一个目录(包括子目录)移动到另一个名为 test 的目录。另外,您的回答有误(谢谢)。
    猜你喜欢
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多