8

リスト内のアイテムをランク付けし、結果をオブジェクトまたは別のリストに保持する方法を見つけようとしています。orderby メソッドについては知っていますが、各アイテムに対応するランク番号を作成する方法が正確にはわかりません。

例えば:

List<int> numbers = new List<int>();

numbers.Add(650);
numbers.Add(150);
numbers.Add(500);
numbers.Add(200);

次に、結果を低から高、または高から低に保存します。

public class NumberRank
{
    public int Number {get; set;}
    public int Rank {get; set;}

    public NumberRank(int number)
    {
        Number = number;
        Rank = ????????;
    }
}

LINQ による解決策はありますか?

4

3 に答える 3

18

Select拡張メソッドのオーバーロードの 1 つはインデックスを返します。

要素のインデックスを組み込むことにより、シーケンスの各要素を新しい形式に射影します。

それを使用してランクを作成できます。

public class NumberRank
{
    public int Number {get; set;}
    public int Rank {get; set;}

    public NumberRank(int number, int rank)
    {
        Number = number;
        Rank = rank;
    }
}

List<int> numbers = new List();

numbers.Add(650);
numbers.Add(150);
numbers.Add(500);
numbers.Add(200);

numbers.OrderBy(n => n)
       .Select((n, index) => new NumberRank(n, index));
于 2013-04-19T07:28:40.503 に答える
12

これはそれを行う必要があります:

public class NumberRank
{
   public int Number {get; set;}
   public int Rank {get; set;}

   public NumberRank(int number, int rank)
   {
      Number = number;
      Rank = rank;
   }
}

class Test
{
   static void Main()
   {
      List<int> numbers = new List<int>();

      numbers.Add(650);
      numbers.Add(150);
      numbers.Add(500);
      numbers.Add(200);

      List<NumberRank> numberRanks = numbers.OrderByDescending(n => n).Select((n, i) => new NumberRank(n, i + 1)).ToList();

      // check it worked
      foreach(NumberRank nr in numberRanks) Console.WriteLine("{0} : {1}", nr.Rank, nr.Number);
      Console.ReadKey();  
   }
}

昇順でランク付けするには (つまり、最も低い番号が最初になるように)、OrderByDescending を OrderBy に置き換えます。

于 2013-04-19T07:29:05.890 に答える
1
Function Rank(Of T As IComparable)(list As IEnumerable(Of T), item As T) As Integer
    Return list.Count(Function(x) x.CompareTo(item) < 0) + 1
End Function

Public Sub Main()
    Dim l = New Integer() {9, 1, 3, 8, 4, 6}
    Console.WriteLine("6 is the " & Rank(l,6) & "th element of ")
    Console.WriteLine([String].Join(" ", l))
End Sub

6 is the 4th element of
9 1 3 8 4 6

または、C# http://dotnetfiddle.net/3ZGeJ1で

于 2014-12-02T11:33:06.617 に答える