などのネストされたリストをシリアル化できないゲームエンジンを使用していますList<List<int>>
。私が必要としているのは、複数のリストを1つのリストに格納する迅速なソリューションです。私はこれを自分で書き込もうとしていますが、解決策がすでに存在するかどうか疑問に思っています。
個別のリストに期待する機能を提供しながら、「仮想」ネストされたリストを1つの大きなリストに格納できるラッパーはありますか?
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();
このようなものはどうですか:
リストをフラット化するには、他の人が提案したようなタプルのフラット化リストを作成するために使用します(以下のすべてのコードはテストされていないことに注意してください)。
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;
}
あなたが後にいるかどうかを明確にすることができます: