0

次のようなメモリ内のデータテーブルがあります。

Tape               Mask                Count
BT1                DML69               3452
BT2                DML69               1569
BT2                DML87               2745
BT3                DML69               3215
BT3                DML87               1542
BT4                DML87               3214
BT5                DML69               2132
BT5                DML87               1241

最大数のマスクのみを含む、テープごとに 1 つの結果をテープごとに 1 つのデータ行を返す LINQ クエリが必要です。すなわち

Tape               Mask                Count
BT1                DML69               3452
BT2                DML87               2745
BT3                DML69               3215
BT4                DML87               3214
BT5                DML69               2132

私はこれをいくつかの異なる方法で実行しようとしましたが、すべて成功しませんでした。これが私の最新の試みです:

        foreach (string tape in singOne.GetDistinctTapes(
                                    converter.ConvertProcessesIDToSingOneID(selectedWafer)))
        {
            var tapeMaskQuery =
                from row in tempTable.AsEnumerable()
                where row.Field<string>("location1") == tape
                select row;

            if (tapeMaskQuery.Count() == 1)
            {
                tapeMaskCountTable.Rows.Add(tapeMaskQuery.ElementAt(0));
            }
            else
            {
                var maxMaskQuery =
                    (from fields in tapeMaskQuery.AsEnumerable()
                    select new
                    {
                        tape = fields.Field<string>("location1"),
                        mask = fields.Field<string>("mask"),
                        count = fields.Field<Int64>("count(*)")
                    }).Max(x => x.count);
                tapeMaskCountTable.Rows.Add(maxMaskQuery);
            }
        }

ここで singOne.GetDistinctTapes() は、ウエハー上の異なるテープのリストを返すだけです。tempTable は、この記事の最初のテーブルの形式の DataTable です。各テープに複数の結果があるかどうかを確認します。ある場合は、「maxMaskQuery」を実行します。これは、テープとマスクの列ではなく、カウント列だけを含む DataRow のみを返すようです。この投稿の 2 番目の表のように、最後に 3 つの列すべてが存在する必要があります。

これを実装する方法についての助けをいただければ幸いです。

よろしく、

カイル

4

5 に答える 5

9

GroupByでこれを行う必要があります。

var query = tapesTable.GroupBy(x => x.Tape)
                      .Select(x => x.OrderByDescending(t => t.Count)
                                    .First());
于 2013-10-30T13:09:29.510 に答える
1
var result = data.GroupBy(x => x.Tape)
                 .Select(g => {
                               var maxItem = g.OrderByDescending(x => x.Count)
                                              .FirstOrDefault();
                               return new { 
                                    Tape = x.Key, 
                                    maxItem.Mask, 
                                    maxItem.Count 
                                  }
                              });
于 2013-10-30T13:11:40.380 に答える
0

最初の文に答えるだけで、GroupBy+OrderByDescendingFirst:

IEnumerable<DataRow> tapeMaskQuery = table.AsEnumerable()
    .GroupBy(row => row.Field<string>("Tape"))
    .Select(group => group.OrderByDescending(r => r.Field<int>("Count"))
                          .First()); 
于 2013-10-30T13:11:50.067 に答える
0

マスクを最大数で保持する必要がある場合は、次のように記述できます。

var maxMaskQuery =
                (from fields in tapeMaskQuery.AsEnumerable()
                select new
                {
                    tape = fields.Field<string>("location1"),
                    mask = fields.Field<string>("mask"),
                    count = fields.Field<Int64>("count(*)")
                }).OrderByDescending(x => x.count).FirstOrDefault();
于 2013-10-30T13:11:58.110 に答える