如何使用LINQ从一个列表创建列表列表?

时间:2014-11-26 01:41:29

标签: c# linq

我在游戏的每一帧都多次这样做。所以寻找一种不多次循环的方法。 谢谢你看看:))

    List<Vector3> listVectors = new List<Vector3>();
    for (int i = 0; i < 2000; i++) {
        listVectors.Add(new Vector3(i,i,i));
    }

    var listX = from v in listVectors select v.x;
    var listY = from v in listVectors select v.y;
    var listZ = from v in listVectors select v.z;

    // Is it possible to create this without looping multiple times
    List<IEnumerable<float>> listV = new List<IEnumerable<float>>{listX,listY,listZ};

2 个答案:

答案 0 :(得分:2)

List<List<float>> lists = listVectors
    .SelectMany(v => new[]{
        new{k = 'x', v = v.x},
        new{k = 'y', v = v.y},
        new{k = 'z', v = v.z}})
    .GroupBy(x => x.k)
    .OrderBy(g => g.Key)
    .Select(g => g.Select(x => x.v).ToList())
    .ToList();

答案 1 :(得分:1)

由于您要产生三种不同的结果,您需要自己编写一个循环:

List<float> listX = new List<float>(listVectors.Count);
List<float> listY = new List<float>(listVectors.Count);
List<float> listZ = new List<float>(listVectors.Count);
foreach (var vec in listVectors) {
    listX.Add(vec.x);
    listY.Add(vec.y);
    listZ.Add(vec.z);
}

你可能会对List<T>.ForEach产生副作用,但这也是一回事:

listVectors.ForEach(vec => {
    listX.Add(vec.x);
    listY.Add(vec.y);
    listZ.Add(vec.z);
});

当然,最好的办法是避免完全复制。你可以通过一个简单的技巧来实现它,它传递Vector3个对象的列表以及&#34;提取&#34;仿函数,像这样:而不是

void Process(IList<float> data) {
    foreach (float f in data) {
        // Do something with f
    }
}

并将其称为

Process(listX);
你写了

void Process(IList<Vector3> data, Func<Vector3,float> extract) {
    foreach (Vector3 v in data) {
        float f = extract(v);
        // Do something with f
    }
}

并致电

Process(listVectors, v => v.x);