1

内部に2つの異なる変数を持つオブジェクトがあります。

次のようになります:ModelB.TextModelB.ValueModelB.Attr

このオブジェクトのリストもあり、次List<ModelB>のようなデータをロードしています。

ModelB.Text = "Car";
ModelB.Value = "345.23";
ModelB.Text = "Car";
ModelB.Value = "343.23";
ModelB.Text = "Car";
ModelB.Value = "323.23";
ModelB.Text = "Toy";
ModelB.Value = "45.23";
ModelB.Text = "Toy";
ModelB.Value = "45.22";
ModelB.Text = "Toy";
ModelB.Value = "45.43";

私がやりたいのは、最大値の最小値の車、おもちゃなどを見つけて、ModelB.Attr = "max";またはのようにそれらをチェックすることですModelB.Attr = "min";

したがって、各タイプのオブジェクトの最大値と最小値をマークする必要があります。そして、はい、すべてのデータはstring残念ながらあり、私は通常それを小数に解析しています。

4

2 に答える 2

3
foreach(var g in models.GroupBy(m => m.Text)
                       .Select(g => g.OrderBy(m => Decimal.Parse(m.Value)))
{
    g.First().Attr = "min";
    g.Last().Attr = "max";
}

あるタイプのアイテム(車など)が1つしかない場合は、としてマークされ"max"ます。としてマークする場合は"min"、適用する属性の順序を変更します。

また、すべてのアイテムのValueプロパティに正しい10進値が含まれていない場合は、フィルタリングを追加できます。

于 2012-12-13T10:16:18.807 に答える
0

さて、ここでは解析エラーやカルチャなどについては気にしません。これらはビジネス上の問題であり、linqの問題ではありません。

複数のオブジェクトの最大値が同じである場合の対処方法もわかりません。すべてにマークを付けるかどうかにかかわらず、最初のオブジェクトにマークを付けます。それらすべてにマークを付けるには、FirstをForEachに置き換えます

foreach(var grp in myList.GroupBy(o => o.Text))
    grp.First(g => decimal.parse(g.Value) == grp.Max(o => decimal.Parse(o.Value)).Attr="max";

編集:これがforeachの実装です

foreach(var grp in myList.GroupBy(o => o.Text))
{
    string min = grp.Min(o => decimal.Parse(o.Value));
    string max = grp.Max(o => decimal.Parse(o.Value));
    foreach(var obj in grp.Where(o => o.Value == min)
        obj.Attr="min";
    foreach(var obj in grp.Where(o => o.Value == max)
        obj.Attr="max";
}
于 2012-12-13T10:11:11.967 に答える