我正在使用无法序列化List<List<int>>
等嵌套列表的游戏引擎。我需要的是一个快速的解决方案,将多个列表存储在一个列表中。我即将自己写这个,但我想知道是否已有任何解决方案。
是否有任何包装器可以将“虚拟”嵌套列表存储到一个大列表中,同时提供您期望从单独列表中获得的功能?
答案 0 :(得分:7)
您可以使用Enumerable.SelectMany
展平嵌套列表:
List<int> flattened = allLists.SelectMany(l => l).ToList();
是否可以将扁平列表展平回嵌套 名单?
您可以使用Tuple<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();
答案 1 :(得分: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;
}
答案 2 :(得分:0)
你能说清楚你是否在追求: