来自数组中对象元素的数组

时间:2014-07-08 16:50:33

标签: c# arrays list class object

假设我有一个类或结构定义如下:

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#中是否有专门为此设计的构造?类和结构是不同的?感谢。

3 个答案:

答案 0 :(得分:3)

您可以使用LINQ查询:

Int32[] xArray = fooList.Select(fooItem => fooItem.x).ToArray();

对于类和结构,此LINQ查询将以相同的方式工作。但是在某些情况下,struct值可以是boxed,它们将多次copied(它们是结尾的结构 - 通过值传递) - 这些都会导致具有多个LINQ操作的大型结构的可能开销在他们身上。

还要考虑到LINQ不是every possible situation的工具。有时普通forwhile)循环将更具可读性,并将提供更高的性能。

答案 1 :(得分:1)

如果他们有共同点,你也可以创建一个itnerface

public interface IFooBarable
{
    int x;
    int y;
}

然后您的收藏只是一个List<IFooBarable>,您可以在其中保存FooBar个对象,并且可以同样方式访问它们。

答案 2 :(得分:1)

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