c# - 添加到可变类型,就好像它是不可变的(无序)

标签 c# arrays immutability

我在窗体上构建一个对象:

return table.Rows.Cast<DataRow>()
  .Select(row => new Something
  {
    Field = row["field1"] as int?,
    Bunch = GetBunch(index)
  });

使用 GetBunch() 如下。

private IList GetBunch(int index) { ... }

它按预期工作。现在,我们注意到我们需要向放入 Bunch 的数组添加一个额外的元素。由于多种原因,更改方法的签名不是一个选项,在其中添加额外的元素也不可行。

我试着像这样添加额外的东西:

return table.Rows.Cast<DataRow>()
  .Select(row => new Something
  {
    Field = row["field1"] as int?,
    Bunch = GetBunch(index).Add(new Thingy() { ... })
  });

但它不起作用,因为 Add() 没有返回包含新元素的原始数组。它返回一个 int。如果原始对象是不可变的,Add() 的结果将是我希望的结果,但显然不是。

是否有可能使可变对象不可变?如果不是(因为我很确定不是),我该如何轻松处理呢? (很容易 = 无需存储创建的内容,然后访问它并将元素添加到 Bunch 属性的数组。)

注意,在这种情况下,结果的顺序并不重要。正确的类型应该是某种类型的,但我被现有的设计束缚住了。

最佳答案

可能是这样的:

return table.Rows.Cast<DataRow>()
.Select(row => {
                  var list = GetBunch(index);
                  list.Add(new Thingy() { ... });
                  return new SomeThing 
                         {
                            Field = row["field1"] as int?,
                            Bunch = list
                         };
                });

正如@Chris 在评论中指出的那样,您可以使用 lambda 语句,但不一定需要使用 lamda 表达式。您可以在 block 内做任何您想做的事情,因为它只是一个采用 DataRow 的方法 并返回 SomeThing

关于c# - 添加到可变类型,就好像它是不可变的(无序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25667568/

相关文章:

c# - 在 c# asp.net Core 中压缩图像

c# - .Net Metro App 中的 MarkUpExtension

jquery - 循环遍历json数组Jquery

arrays - react 原生 : Key Value array or hasmap?

objective-c - 在 Objective-C 中隐藏不可变接口(interface)背后的私有(private)可变属性

没有带数据库事务或 TransactionScope 的 EF 的 C# UnitOWork 实现

c# - 在 Silverlight 中生成类似 UML 的框图

c - 传递给函数的二维数组

ruby - 为什么是替换而不是替换!对于 ruby 中的字符串?

javascript - 不可设置和不可写的属性仍然是可变的