从数组中对象的元素生成数组
本文关键字:数组 元素 对象 | 更新日期: 2023-09-27 18:12:04
假设我有一个这样定义的类或结构:
public class foo
{
public int x;
public int y;
}
or
public struct bar
{
public int x;
public int y;
}
假设我有一个对象的数组或列表,foo's
或bar's
的数组。现在我想创建一个x和/或y的数组或列表。在c#中是否有一种简单的方法可以做到这一点,不需要迭代数组的每个foo
或bar
,然后将所需的成员变量添加到另一个数组?
例如,我现在是这样做的:
//For some List<foo> fooList
//get the x's and store them to the array List<int> xList
foreach (var fooAtom in fooList)
{
xList.Add(fooAtom.x);
}
是否有更快/更少的编码方式做到这一点?c#中是否有专门为此设计的结构?它是不同的类和结构?谢谢。
您可以使用LINQ查询:
Int32[] xArray = fooList.Select(fooItem => fooItem.x).ToArray();
这个LINQ查询将以相同的方式对类和结构体工作。但是,在某些情况下,结构体值可以被装箱,并且它们将被复制多次(它们最后是按值传递的结构体),所有这些都可能导致具有多个LINQ操作的大型结构体的开销。
还要考虑到LINQ不是适用于所有可能情况的工具。有时,普通的for
(while
)循环将更具可读性,并提供更好的性能。
如果它们有共同之处,您还可以创建一个接口
public interface IFooBarable
{
int x;
int y;
}
然后你的集合就是一个List<IFooBarable>
,你可以同时存放Foo
和Bar
对象,它们可以以同样的方式访问
我会创建一个具有x和y属性的基类或接口。这可以在迭代集合时提供更大的灵活性:
public interface IHasXY { int x { get; } int y { get; } }
public class Foo : IHasXY { public int x { get; set; } public int y { get; set; } }
public struct Bar : IHasXY { public int x { get; set; } public int y { get; set; } }
你甚至可以连接foo和bar集合:
var allXs = fooList.Concat(barList).Select(o => o.x).ToArray();