-1

質問: リスト番号のリストがあります(List<List<int>> listNumberCollection): 4 行 x 3 列

1 3 9
6 5 6
3 2 7
2 7 2

列にランクを記録するにはどうすればよいですか (最小の数字が 1 番目です)。

1 2 4
4 3 2
3 1 3
2 4 1

私の仕事: 列の数字を並べ替えるには、転置用の関数を作成します (4 列 x 3 行):

1 6 3 2
3 5 2 7
9 6 7 2

private List<List<Double>> MatrixTransposition(int k, List<List<Double>> listNumberCollection)
{
      var revisedAllRanks = new List<List<Double>>();
      for (int i = 0; i < k; i++ )
      {
           var allRanks = new List<Double>();
           allRanks.AddRange(listNumberCollection.Select(value => value[i]));
           revisedAllRanks.Add(allRanks);
      }
      return revisedAllRanks;
}

2 つのプロパティ (Number、Rank) を持つ NumberRank という名前のクラスを作成し、NumberRank のリストに追加しようとしました

var revisedListNumberCollection = MatrixTransposition(k, listNumberCollection);
var listNumberRanks = new List<List<NumberRank>>();
foreach(List<Double> vectorsCollection in revisedListNumberCollection)
{                    
     List<NumberRank> numberRanks = vectorsCollection.OrderByDescending(number => number).Select((number, i) => new NumberRank(number, i + 1)).ToList();                        
     listNumberRanks.Add(numberRanks);
}

ただし、取得した結果はランク付きの順序付けられた番号 (最初の列: 1-1 2-2 3-3 6-4...) であり、必要なもの (1-1 6-4 3-3 2-2) ではありません。ありがとう!

4

2 に答える 2

0

私は次のように行きます:

var input = new List<List<int>>() {
    new List<int> { 1, 6, 3, 2 },
    new List<int> { 3, 5, 2, 7 },
    new List<int> { 9, 6, 7, 2 }
};

var results = new List<List<int>>(input.Count);
foreach (var list in input)
{
    var rankDict = list.OrderBy(x => x).Select((v, i) => new { v, i }).ToDictionary(x => x.v, x => x.i);
    results.Add(list.Select(x => rankDict[x] + 1).ToList());
}

foreach (var list in results)
{
    Console.WriteLine(string.Join(" ", list.Select(x => x.ToString())));
}

純粋な LINQ ではありませんが、期待どおりに動作します。結果は次のとおりです。

1 4 3 2
2 3 1 4
4 2 3 1

ただし、1 つの制限があります。単一のリスト値が一意である必要があります。

于 2013-08-11T12:48:32.210 に答える