2

私はこれまで LINQ をあまりやったことがないので、いくつかの面で混乱を招くことがよくあります。最近、誰かが GroupBy 演算子を使用して次のようなクエリを作成しました。彼らがしたことは次のとおりです。

List<int> ranges = new List<int>() {100, 1000, 1000000};

List<int> sizes = new List<int>(new int[]{99,98,10,5,5454, 12432, 11, 12432, 992, 56, 222});

var xx = sizes.GroupBy (size => ranges.First(range => range >= size));

xx.Dump();

基本的に、キー式がどのように機能するかについて非常に混乱しています。つまり、ranges.First(range => range >= size

誰でも光を当てることができますか?これをもっとわかりやすくするために分解できますか?First で 1 つの結果が得られると思いました。

前もって感謝します。

4

6 に答える 6

3

size => ranges.First(range => range >= size)この Func は、サイズがグループ化されるキーを構築します。現在のサイズを取得し、現在のサイズ以上の最初の範囲を見つけます。


使い方:

サイズ99の最初の範囲>= 99は です100。したがって、計算されたキー値は になります100。サイズはキーでグループ化されます100

次のサイズ98、もキーを取得10してそのグループに移動します。5100

sizeの場合、5454計算されたキー値は1000000( より大きい最初の範囲です5454。したがって、新しいキーが作成され、 size は key でグループ化されます1000000

等。

于 2012-11-19T10:46:43.160 に答える
3

ranges.First(range => range >= size)を返します。int最初range>=現在のsize値です。したがって、すべてのサイズは 1 つの範囲に属します。それがグループです。

指定されたサイズFirstの範囲がない場合、例外がスローされることに注意してください。>=

于 2012-11-19T10:48:59.613 に答える
1

わかりやすくなるかどうかはわかりませんが、本当に分解したい場合は、次のようにすることができます(LinqPadを使用していると思います)

   List<int> ranges = new List<int>() {100, 1000, 1000000};
   List<int> sizes = new List<int>(new int[]{99,98,10,5,5454, 12432, 11, 12432, 992,    56, 222});

   void Main()
   {
        var xx = sizes.GroupBy (size => GetRangeValue(size));

        xx.Dump();
    }

   private int GetRangeValue(int size)
   {
        // find the first value in ranges which is bigger than or equal to our size
        return ranges.First(range => range >= size);
    }

そして、はい、あなたは正しいです、Firstは1つの結果を生成します。

于 2012-11-19T15:30:54.467 に答える
0

実際、first はグループ化のキーとなる 1 つの値を返します。

ここで何が起こるか - First はサイズの各値に対して呼び出され、サイズ (100、100、100、100、1000000、1000000 など) よりも大きい最初の範囲を返します - 「サイズ」はこの値によってグループ化されます。範囲ごとにグループ化が返されます。たとえば、100: 99,98,10,5,11...

于 2012-11-19T11:08:18.270 に答える