C# LINQ选择多个-修改展平集合

C# LINQ选择多个-修改展平集合,c#,linq,lambda,C#,Linq,Lambda,我有一个名为ACTIVITY的类。此类包含一个圈列表,每个圈都有一个轨迹点集合 活动-->多圈-->多个跟踪点 每当我展平TRACPOINTS集合时,我都会得到所有TRACPOINTS的列表。但是当我修改这些文件时,当然不会修改原件,因为它是副本 是否有任何方式可以在每圈的轨迹点列表中更改我对展平轨迹点所做的任何更改?只要轨迹点是一个结构,就不可能以任何合理的方式进行更改 每当将struct variable或field的值指定给另一个变量或字段时,都会复制其内容。如果将其作为方法参数传递或从方

我有一个名为ACTIVITY的类。此类包含一个圈列表,每个圈都有一个轨迹点集合

活动-->多圈-->多个跟踪点

每当我展平TRACPOINTS集合时,我都会得到所有TRACPOINTS的列表。但是当我修改这些文件时,当然不会修改原件,因为它是副本


是否有任何方式可以在每圈的轨迹点列表中更改我对展平轨迹点所做的任何更改?

只要轨迹点是一个结构,就不可能以任何合理的方式进行更改

每当将struct variable或field的值指定给另一个变量或字段时,都会复制其内容。如果将其作为方法参数传递或从方法返回,则复制其值。这就是值语义[1]。将其与原子类型(如
int
)进行比较,后者也具有值语义。您可能希望下面的代码打印2,而不是3

static function Change(int j) { j = 3; }
static void Main(string[] args) { 
   int i = 2;
   Change(i);
   System.Console.WriteLine(i);
}
如果您选择了SelectMany,那么集合中的每个值都可能被分配给某个临时局部变量,然后从迭代器(SelectMany)返回,因此它会被复制,事实上,在从迭代器中出来之前可能会被复制多次。因此,您正在更新的是结构的副本。与示例中一样,您没有更改变量
i
,而是将其副本存储在变量
j

这就是为什么结构应该是不可变的。结构中的属性不应该包含getter和setter,而应该只有getter。要更改结构属性的值,可以实现复制整个原始结构、更改所需属性的值并返回新结构实例的方法。事实上,它的副本也会被退回。例如:

struct S {
   int f;
   public int F { get { return this.f; } }
   public S SetF(int newVal) {
      var s = new S();
      s.f = newVal;
      return s;
   }
}

var x = new S();
x = x.SetF(30);
也就是说,使用指针和不安全的C#可以实现您想要的,但是相信我,将结构更改为类会更容易,这样它们就具有引用语义而不是值语义,或者保持结构,但使它们不可变,并且不使用Linq,而是使用老式循环。如果您想在这样的场景中使用Linq来实现SelectMany之类的功能,您可能不会太在意结构和类之间的性能差异


[1]

为什么?
Tracpoint
a
struct
?请您输入一些代码。。。直到我们看到这些类型的定义。