从数组中对象的元素生成数组

本文关键字:数组 元素 对象 | 更新日期: 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'sbar's的数组。现在我想创建一个x和/或y的数组或列表。在c#中是否有一种简单的方法可以做到这一点,不需要迭代数组的每个foobar,然后将所需的成员变量添加到另一个数组?

例如,我现在是这样做的:

//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>,你可以同时存放FooBar对象,它们可以以同样的方式访问

我会创建一个具有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();