2

にいくつかの番号付きリストが保存されていますList<string>

List<string> all = new List<string>()
{
  "1. Apple",
  "2. Banana",
  "3. Coconut",
  "1. Ant",
  "2. Beaver",
  "3. Cat"
  ...
}

このリストを、各リストに 1 ~ 3 を含むリストのリストに分割したいと考えています。

List<List<string>> split = new List<List<string>>()
{
  new List<string>() { "1. Apple", "2. Banana", "3. Coconut"},
  new List<string>() { "1. Ant", "2. Beaver", "3. Cat"}
}

常に「1」があります。これを区切り文字として使用できます。ネストされた 2 つの for ループを必要とせずに、LINQ でこれを行う巧妙な方法はありますか?

更新:これは、常に 3 ではなく、任意の長さで一般化されることを望みます。

4

4 に答える 4

2

代わりに辞書型を使用できるようです。アイテムの番号とアイテム自体を保存するのではなく、アイテム番号をキーとして、アイテム自体を値として設定できます。これを実現する方法の例を次に示します。

newList = {'1':'Apple','2':'Banana','3':'Pear'}  
animalList = {'1':'Bear','2':'Cat','3':'Dog'}

各アイテムを反復処理するか、メソッドを使用してキーまたは値で呼び出すことができます。

于 2012-12-08T23:28:55.627 に答える
2
List<List<string>> result = all.GroupAdjacent((g, x) => !x.StartsWith("1."))
                               .Select(g => g.ToList())
                               .ToList();

ここからGroupAdjacent 拡張メソッドを使用します。

于 2012-12-08T23:29:00.510 に答える
1

目的の結果を得るためのもう 1 つのオプション (各項目に順番にグループ インデックスを割り当て、そのインデックスでグループ化する):

int groupIndex = 0;
List<List<string>> split = all.Select(s => {
                                   if (s.StartsWith("1."))
                                      groupIndex++;
                                   return new { groupIndex, s }; })
                              .GroupBy(x => x.groupIndex)
                              .Select(g => g.Select(x => x.s).ToList())
                              .ToList();

別のオプション - 結果を蓄積する (これには、リストを 1 回トラバースする必要があります)

List<List<string>> split =
    all.Aggregate(new List<List<string>>(), (acc, s) =>
                    { 
                        if (s.StartsWith("1."))
                            acc.Add(new List<string>());
                        acc[acc.Count - 1].Add(s);
                        return acc; 
                    });  
于 2012-12-09T00:08:46.050 に答える
0

リストについて多くの仮定をせずに LINQ を使用してこれを行う巧妙な方法は実際にはありません. 常に 3 つの項目のグループが存在するのでしょうか、それとも時々多かれ少なかれ存在するのでしょうか?

そもそも文字列の保存方法を変更しないのはなぜですか。代わりに a を使用すると、List<List<string>>ofListがあります。List<string>

于 2012-12-08T23:31:21.387 に答える