3

我正在使用无法序列化嵌套列表的游戏引擎,例如List<List<int>>. 我需要的是一个快速的解决方案,它将多个列表存储到一个列表中。我即将自己写这个,但想知道是否已经存在任何解决方案。

是否有任何包装器可以将“虚拟”嵌套列表存储到一个大列表中,同时提供您期望从单独列表中获得的功能?

4

3 回答 3

8

您可以使用Enumerable.SelectMany扁平化嵌套列表:

List<int> flattened = allLists.SelectMany(l => l).ToList();

是否可以将扁平列表展开回嵌套列表?

您可以使用 aTuple<int, int>将原始列表的编号存储在中Item1,将编号本身存储在 中Item2

// create sample data
var allLists = new List<List<int>>() { 
    new List<int>(){ 1,2,3 },
    new List<int>(){ 4,5,6 },
    new List<int>(){ 7,8,9 },
};

List<Tuple<int, int>> flattened = allLists
    .Select((l, i) => new{ List = l, Position = i + 1 })
    .SelectMany(x => x.List.Select(i => Tuple.Create(x.Position, i)))
    .ToList();

// now you have all numbers flattened in one list:
foreach (var t in flattened)
{
    Console.WriteLine("Number: " + t.Item2); // prints out the number
}
// unflatten
allLists = flattened.GroupBy(t => t.Item1)
                    .Select(g => g.Select(t => t.Item2).ToList())
                    .ToList();
于 2012-07-24T17:57:08.837 回答
1

像这样的东西怎么样:

要展平列表,请使用其他人建议的东西来制作元组的展平列表(注意,下面的所有代码都未经测试):

List<List<int>> myStartingList = new List<List<int>>();
List<Tuple<int, int, int>> myFlatList = new List<Tuple<int, int, int>>();
for (var iOuter = 0; iOuter < myStartingList.Count; iOuter++)
    for (var iInner = 0; iInner < myStartingList[iOuter].Count; iInner++)
        myFlatList.Add(new Tuple<int, int, int>(iOuter, iInner, myStartingList[iOuter][iInner]);

并展开:

List<List<int>> myNestedList = new List<List<int>>();
int iOuter=-1;
foreach (var t in myFlattenedList)
{
    if (iOuter != t.Item1)
        myNestedList.Add(new List<Int>());
    iOuter = t.Item1;
    myNestedList[t.Item1][t.Item2] = t.Item3;
}
于 2012-07-24T18:12:57.663 回答
0

你能澄清一下你是否在追求:

  1. 一个可以表示嵌套列表的序列化库(例如 JSON.NET 应该能够)。
  2. 一种扁平化列表的方法
于 2012-07-24T17:57:18.247 回答