1

私は次のようなデータテーブルを持っています:

ChNo     ChData
1         0.1
1         0.2
2         0.0
1         0.1
2         0.2
1         0.1
1         0.1
2         0.0

chNOのiに基づく最小値については、次のようなクエリを記述しました

var minLPData = from minData in loadProfileData.AsEnumerable()
                                orderby minData["ChNo"]
                                group minData by minData["ChNo"] into g                                
                                select new
                                {
                                    ChNo = g.Key,
                                    ChData = g.CopyToDataTable().Compute("Min(ChData)", string.Empty)
                                };

しかし、結果は私が好きになっています

ChNo     ChData
1         0.0
2         0.0

重複を含む ChNo に基づくすべての最小値が必要です

ChNo     ChData
1         0.1
1         0.1
1         0.1
1         0.1
2         0.0
2         0.0

ターゲットテーブルを取得するためにどのような変更が加えられましたか。

4

4 に答える 4

2

だから私が理解しているように、あなたは次のことをする必要があります:

  1. チャネルごとに要素をグループ化する
  2. 各チャネルの最小値を見つける
  3. この値を持つすべての要素を検索します

だから、ここに行きます:

var minLPData =
    from data in loadProfileData.AsEnumerable()
    group data by data["ChNo"] into gData
    orderby gData.Key
    let minValue = gData.Min(d => d["ChData"])
    select new
        {
            ChNo = gData.key,
            ChData = gData.Where(d => d["ChData"] == minValue).ToList()
        };

それはあなたに任意のタイプの列挙可能なものを与えるでしょう。その後、それを辞書に変換できます。匿名型のChDataメンバーは、初期データと同じ型のリストですが、変換する場合はSelectを実行できます。

ここでのコードとの主な違いは、ChDataメンバーの構築でのWhere()句の使用(および最小値を計算するためのlet句の使用)です。

編集:(リストのリストではなく)1つのレベルの値のリストが必要な場合は、SelectManyを使用できます。

var plainList = minLPData.SelectMany(g => g.ChData.Select(d => new { ChNo = g.key, ChData = d["ChData"] }));
于 2012-10-30T13:39:48.277 に答える
1
IEnumerable<DataRow> lowestChNoRows = loadProfileData.AsEnumerable()
            .GroupBy(r => r.Field<double>("ChNo"))
            .OrderBy(g => g.Key)
            .First();

DataTable最小値の行を含む新しい行が必要な場合:

DataTable tblLowestChNoRows = lowestChNoRows.CopyToDataTable();
于 2012-10-30T12:57:57.120 に答える
1

なぜグループ化するのですか?すべてのリストの最小値が必要なようです。

var list = loadProfileData.AsEnumerable().ToList();

// Get the minimum value
var minValue = list.Min(v => v["ChData"]);

// Get all elements that have the same value than the minimum value
// Order them by ChNo
var minimums = list.Where(v => v["ChData"] == minValue).OrderBy(v => v["ChNo"]);

次に、次のように、このリストを必要に応じて変換できます。

var minLPData = minimums.Select(v => new { ChNo = v["ChNo"], ChData = v["ChData"] });
于 2012-10-30T13:02:39.700 に答える
0
// Prepare the data
var table = new DataTable();    

// The type must be specified explicitly,
// otherwise it will be string
table.Columns.Add("ChNo", typeof(int));
table.Columns.Add("ChData", typeof(double));

new[]
{
    new {Key = 1, Data = 0.0},
    new {Key = 1, Data = 0.1},
    new {Key = 2, Data = 0.0},
    new {Key = 1, Data = 0.0},
    new {Key = 2, Data = 0.1},
    new {Key = 1, Data = 0.0},
    new {Key = 1, Data = 0.0},
    new {Key = 2, Data = 0.0},
}
.ToList().ForEach(p => table.Rows.Add(p.Key, p.Data));

// Make a projection, so it is easier to work with
var data = table.AsEnumerable().Select(p => 
    new { Key = p["ChNo"], Data = p["ChData"] }).ToArray();

var minValues = data.GroupBy(p => p.Key)
    .ToDictionary(p => p.Key, p => p.Min(i => i.Data));

var res = data.Where(p => minValues[p.Key] == p.Data)
    .OrderBy(p => p.Key)
    .ToArray();

結果

于 2012-10-30T13:18:43.380 に答える