2009-03-04 4 views
0

LINQクエリを使用して、すべて二重値の子リストが多数あるリストを取得できます。LINQを使用してC#で子リストを処理し、新しいオブジェクトリストを取得するにはどうすればよいですか?

これからqueryResultを取得します。

最初、最後、最高、最低の2倍の値を取得するにはどうすればよいですか?

新しいオブジェクトでなければならず、新しい戻り値をリストにする必要がありますか?

+0

サンプルコードを入力してください。現時点での状況を理解するのは難しいです。 –

+0

http://stackoverflow.com/questions/611441/c-linq-grouping-by-specific-timestamp-intervals新しいスレッドを開始する必要があります。 –

+0

numsy、ここであなたが試しているものの明確なサンプルを提供してください私はリンクに行きましたが、この記事の意味は、あなたがそこで解決したい状況で失われていると思います。 – eglasius

答えて

0

あなたの質問はかなり不明です。ただし、LINQクエリから返される一連のリストオブジェクトがあり、それらのサブリストのすべての値から集計を取得するように思えます。私はLINQでこれを行う方法を見たことがありませんでした。正直なところ、それを行う方法があっても、パフォーマンスはそれほど高くないとは思いません。あなたが探している集計は、ループを使って手動で計算するのはかなり簡単です。このようなもの:

double min = 200000000; 
double max = -200000000; 
double first = 0; 
double last = 0; 
bool hasFoundFirst = false; 
foreach (List<double> childList in queryResults) 
{ 
     foreach (double val in childList) 
     { 
      if (!hasFoundFirst) 
      { 
       hasFoundFirst = true; 
       first = val; 
      } 

      if (val < min) 
       min = val; 
      if (val > max) 
       max = val; 
      last = val; 
     } 
} 

非常に効率的な方法で探しているようなものがあります。この種のことは、コードを効率的にコーディングできれば、LINQより速くなる傾向があります。 LINQは素晴らしく、私はそれを多くのものに使用しますが、それは多くの中でただ一つのツールです。

1

ハンドコードバージョンは少し高速ですが、パフォーマンスがアプリケーションの重要な問題であることが分かっていない限り、私は心配しません。コードのLINQのバージョンは次のようになります。

IEnumerable<List<double>> queryResults = /*...*/ 

    var aggregates = 
    from ds in queryResults 
    select new { 
     First = ds[0], Last = ds[ds.Count - 1], 
     Lowest = ds.Min(), Highest = ds.Max() }; 

私はこれは間違いなく:-)を読みやすいと思います。ネストしたもの(ds)のタイプがListではない場合は、直接インデックス作成の代わりにFirst()Last()の拡張メソッドを使用する必要があります。

パフォーマンスに興味がある場合は、複数のスレッドでクエリを実行するParallel LINQを使用することもできます。短いリストのために、それを行う本当の理由はありませんが、コレクションが大きい場合は、パフォーマンスが向上します(シングルスレッドハンドコーディングバージョンよりも優れています)。

関連する問題