【问题标题】:Passing a null value as a string将空值作为字符串传递
【发布时间】:2014-06-30 13:31:41
【问题描述】:

我有以下糟糕的代码:

CurrentInvoice = invoiceTable.AsEnumerable()
                    .First().ItemArray
                    .Where(a == null, a = (int a).Tostring("null"))
                    .Select(i => i.ToString())
                    .ToArray();

我正在尝试使用“Where”方法将任何空值作为读取“null”的物理字符串传递,而不会破坏行的其余部分。我会使用“Where”方法到达任何地方吗?

【问题讨论】:

  • 那么你的代码目前的问题是什么?
  • 看起来更像Select 而不是where。
  • where 子句缺少 lambda .Where(a => a....)?
  • 我的意思是,您的问题语法无效,实际上,您的 select 应该按照 vcsjones 的说明这样做
  • 目前还不清楚您要在这里做什么。 Where 用于过滤。这与“将任何空值作为读取 'null' 的物理字符串传递”如何匹配?

标签: c# .net string linq


【解决方案1】:

Where 语句对数组进行过滤,但需要对每个单元格进行转换,即Select 语句。

你需要像.Select(a => a ?? "null") 这样的东西而不是Where 我想?

【讨论】:

    【解决方案2】:

    我不明白你真正想要的是什么,但也许你需要类似的东西:

    CurrentInvoice = invoiceTable.AsEnumerable()
                        .First().ItemArray
                        .Select(x => x == null ? "null" : x) //or x ?? "null" for more info check the null coalescing operator
                        .ToArray();
    

    所以你将字符串从null“转换”为"null"。如您所见,您不需要使用Where() 语句过滤ItemArray

    【讨论】:

      【解决方案3】:

      我认为你在这里尝试使用 LINQ 过于复杂了;这看起来像DataTable 的第一行,在这种情况下:

      object[] arr = invoiceTable.Rows[0].ItemArray;
      for(int i = 0 ; i < arr.Length ; i++) {
          if(arr[i] == null || arr[i] is DBNull) arr[i] = "null";
      }
      

      这样更容易编写、更容易理解并且效率更高。

      编辑:如果最终结果是(cmets)打算成为string[],那么:

      object[] arr = invoiceTable.Rows[0].ItemArray;
      string[] result = Array.ConvertAll(arr,
          val => (val == null || val is DBNull) ? "null" : val.ToString());
      

      【讨论】:

      • 嗨,Marc,您对这种方法更有效的评论感兴趣。我一直认为,在幕后,LINQ 语句将在诸如事物之类的情况下编译成基本相同的逻辑流。不是这样吗?
      • @PulseLab 并非如此;首先我们考虑.AsEnumerable().First() - 它必须创建一个枚举器/迭代器,以执行已经通过索引器直接可用的操作。 Select 涉及一个委托,ToArray 涉及另一个枚举器/迭代器和一个数组创建(实际上,可能有几个:至少一个超大,最后一个合适)。由于.ItemArray已经是每个get 的新数组实例,我们可以简单地避免所有这些并改变.ItemArray 的结果;便宜得多。没有迭代器;没有枚举器;没有代表;没有抽象;一个数组。
      • (+1) 感谢您的解释,对未来有用。
      • 我可以用object[] arr = invoiceTable.Rows[0].ItemArray; CurrentInvoice = Array.ConvertAll(arr, val =&gt; (val == null || val is DBNull) ? "null" : val.ToString()); 替换CurrentInvoice = invoiceTable.AsEnumerable().First().ItemArray .Select(a =&gt; a ?? "null").Select(i =&gt; i.ToString()).ToArray(); 吗?它似乎在IDE中工作,但我不确定这是否会影响回程(数组>数据集>数据适配器>数据库>
      • @RoteKatze 使用 ItemArray 后,与原始数据的任何关联都会丢失。 ItemArray 始终是数据的独立副本
      猜你喜欢
      • 2020-11-06
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多