2

stockValues と呼ばれる DailyValue 構造体のリストがあります。最大値と最小High値を持つオブジェクトを見つける必要があります。

(参考までに構造体はこちら)

struct DailyValues
{
        public DateTime Date { get; private set; }
        public decimal Open { get; private set; }
        public decimal High { get; private set; }
        public decimal Low { get; private set; }
        public decimal Close { get; private set; }
        public decimal Volume { get; private set; }
        public decimal AdjClose { get; private set; }
}

色々と試してみましたが、

var mx = stockValues.Max(sv => sv.High);

正しい最大値のみを提供しますが、オブジェクト全体とそのメンバーにアクセスすることはできません(実際の値とそれが発生した日付が必要です)。だから私はこれを試みました:

var stuff = from s in stockValues
                        group s by s.Date into g
                        where g.Max(x => x.High)
                        select g;

ただし、これは単にg.Max(..)コンパイラが 10 進数をブール値に暗黙的に変換できないことを強調して示しているだけです。私は C# を初めて使用するわけではありませんが、Linq の経験がなく、Linq を正しく理解しているようには見えません (これは非常に単純なことだと思いますが、正しく実行していないだけです)。誰かが私を正しく操縦できますか?

いつものように、事前にすべてに感謝します!

4

2 に答える 2

6

moreLINQライブラリのメソッドMaxByMinByメソッドを使用できます。

var max = stockValues.MaxBy(sv => sv.High);
var min = stockValues.MinBy(sv => sv.High);

並べ替えようとしているプロパティの最大/最小値ではなく、オブジェクト全体を返します。

LINQ メソッドの標準セットを使用したい場合は、次の操作を実行できます。

var max = stockValues.OrderByDescending(sv => sv.High).First();
var min = stockValues.OrderBy(sv => sv.High).First();

または、注文を 1 回だけ実行するには:

var ordered = stockValues.OrderBy(sv => sv.High).ToList();
var max = ordered.Last();
var min = ordered.First();
于 2013-11-02T22:56:15.290 に答える
2

2つのステップで実行する必要があると思います:

var mx = stockValues.Max(sv => sv.High);
var result = stockValues.Where(sv=>sv.High == mx);

1個だけ欲しい場合FirstOrDefaultの代わりに使えます。Where

アップデート

1つのアイテムだけが必要な場合は、使用するのAggregate最良の選択だと思います:

var result = stockValues.Aggregate((a, b) => b.High > a.High ? b : a);

(同じ max のHigh) 複数の項目を取得するには、コードは次のようになります。

var results = stockValues.Aggregate(new List<DailyValues>(), (a,b)=>{
                                    if (a.Count == 0) a.Add(b);
                                    else if (b.High >= a[0].High){
                                      if(b.High > a[0].High) a.Clear();
                                      a.Add(b);
                                    }                
                                    return a;
                                 });
于 2013-11-02T22:56:07.033 に答える