添加到一个可变类型,好像它是不可变的(无序)

Kon*_*ten 1 c# arrays immutability

我在表单上构建一个对象:

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

使用GetBunch()如下.

private IList GetBunch(int index) { ... }
Run Code Online (Sandbox Code Playgroud)

它的工作原理应该如此.现在,我们已经注意到我们需要在我们放入Bunch的数组中添加一个额外的元素.由于一系列原因,不能更改方法的签名,也不可能在其中添加额外元素.

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

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

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

是否有可能使可变对象不稳定?如果没有(因为我相当肯定不是),我怎么能轻易处理?(很容易=没有存储创建的东西,然后访问它并向Bunch属性的数组添加一个元素.)

注意,在这种情况下,结果的顺序并不重要.适当的类型将是某种类型的袋子,但我是由现有的设计手工绑定.

Sel*_*enç 5

这样的事情可能是:

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
                         };
                });
Run Code Online (Sandbox Code Playgroud)

正如@Chris在评论中指出的那样你可以使用lambda语句,你不一定需要使用lamda表达式.你可以在块中做任何你想做的事情,因为它只是一个接受DataRow和返回的方法SomeThing.