2

私は数日間、しつこい問題を抱えています。これが私がやろうとしていることです:

さまざまな数値セットを複数の方法で操作するプログラムを作成していますが、これまでのところ、ループを使用してそのような計算の 1 つを制御し、ループするたびに int 値 x と int 値 y を出力するようにしています。

現在、x は連続しており、カウンターから派生しています。y は単なる変数です。

繰り返しますが、データ行を読み取る単純なループがあります

foreach (DataRow dr in dTable.Rows)
{
....
I output x and y (after some calculations)
....
}

ここで、各行に対してこの 2 つの値を取得し、最後に値 y に基づいて並べ替えを行いたいと思います。もともとは、Javaで行っていたようにハッシュマップを使用して値でソートするだけでしたが、c#でデータディクショナリとして行うのは難しいと感じています(一時テーブルも使用したくありません)のみキーでソートできます(私の場合はx)

では、どのようなアプローチをとればよいでしょうか。- ループの出力ペア値をデータテーブルの入力として使用しますか? - かなり複雑に見える 2 次元配列を使用しますが、最終的には x と y の間のペア関係を維持する唯一の方法ですか?

または、Javaハッシュマップを値でソートするのと同等のことを行う他の方法はありますか?

4

3 に答える 3

2

y 値が一意である場合、次の可能性があります。

var list = new SortedList<YType, XType>();
... Loop ...
     list.Add(yValue, xValue);

これは、y 値によってキー付けされ、並べ替えられますが、キーは一意である必要があります。

物事をより複雑にするために、キーとソートSortedDictionary<,>されています。ただし、O のいくつかの小さな違い - add または fetch が最も安いかどうかなど。

于 2011-02-07T15:59:31.887 に答える
1

データ ペアを表すクラスを作成し、すべてのペアを何らかのリストに格納します。IComparable2 番目の値でソートするように実装し、通常の方法でソートします (Java の例ですが、C# に簡単に変換できるはずです)。

class DataPair implements Comparable { 
     int x;
     int y;

     public int compareTo(DataPair o) {
         return y - o.y;
     }
}

DataPairs のリストを作成し、完了したらライブラリ API で並べ替えます。比較関数の実装により、必要な結果が得られるはずです。

于 2011-02-07T16:00:23.350 に答える
0

マップ型のデータ構造をまったく使用せずに、LINQ を使用してこの種の操作を行います。

var list = from dr in dTable.Rows
           let x = ComputeX(dr)
           let y = ComputeY(dr)
           orderby y
           select new { x, y };
于 2011-02-07T16:05:15.387 に答える