IEnumerable <T> .Concat - 可以在不更改引用的情况下工作的替换?

Ear*_*rlz 2 c# collections ienumerable concatenation

我最近被(在我看来太常见了)得到了Concat回报的结果,而不是追加到列表本身.

例如.

List<Control> mylist=new List<Control>;
//.... after adding Controls into mylist
MyPanel.Controls.Concat(mylist); //This will not affect MyPanel.Controls at all.

MyPanel.Controls=MyPanel.Controls.Concat(mylist); //This is what is needed, but the Controls reference can not be reassigned (for good reason)
Run Code Online (Sandbox Code Playgroud)

那么,当集合引用是只读时,还有其他一些组合两个列表的方法吗?

使用foreach是唯一的方法吗?

foreach(var item in mylist){
  MyPanel.Controls.Add(item);
}
Run Code Online (Sandbox Code Playgroud)

没有foreach会有更好的方法吗?

Ben*_*igt 5

许多集合都有一个AddRange方法,winforms ControlCollection就是其中之一.

MyPanel.Controls.AddRange(mylist.ToArray());
Run Code Online (Sandbox Code Playgroud)

这有利于告诉容器您将同时添加许多控件,因此它可能会延迟布局步骤,直到完成添加所有控件.

  • OTOH关于"组合两个列表"的问题,List <T> .AddRange接受IEnumerable <T>,因此您可以直接传递另一个List. (2认同)