2

入力テーブルのすべての行に対して複数の行が返されるように、テーブルの行から出力テーブルにデータを転置する必要があります。出力の各行のデータを抽出するためのロジックは、入力行の特定の列に値が存在するかどうかによって異なります。

例えば

入力テーブル

A、B、C、D、E、F

出力テーブル

A、B、C、[値がDに存在する場合、Dの値に対する何らかの操作]

A、B、C、[値がEに存在する場合、Eの値に対する何らかの操作]

A、B、C、[値がFに存在する場合、Fの値に対する何らかの操作]

これを行うために、私はこのようなことをするつもりです:

private IEnumerable<OutputRow> BuildOutputTable(DataTable inputTable)
{
    var outputRows = from inputRow in inputTable.AsEnumerable()
                     select new outputRow(inputRow, *delegateToProcessor*);
    return gbbOutputRows;
}

ただし、これには、追加の値の列ごとに繰り返す必要があります。それを避けて、「select new outputrow」が複数の行を返すように、単一のデリゲートを渡すことはできますか?

4

4 に答える 4

1

私はします:

var DRows = from inputRow in inputTable.AsEnumerable()
                 where inputRow.D == 'some value'
                 select new outputRow(inputRow, *delegateToProcessor*)

var ERows = from inputRow in inputTable.AsEnumerable()
                 where inputRow.E == 'some value'
                 select new outputRow(inputRow, *delegateToProcessor*)

var FRows = from inputRow in inputTable.AsEnumerable()
                 where inputRow.F == 'some value'
                 select new outputRow(inputRow, *delegateToProcessor*)

return DRows.Union(ERows).Union(FRows);
于 2012-11-08T13:01:47.807 に答える
1

次のような関数を作成します。

public IEnumerable<OutputRow> GetOutputRows(InputRow input)
{
    if ( ** some condition on input.D ** )
        yield return new OutputRow(inputRow, *delegateToProcessor*);
    if ( ** some condition on input.E ** )
        yield return new OutputRow(inputRow, *delegateToProcessor*);
    if ( ** some condition on input.F ** )
        yield return new OutputRow(inputRow, *delegateToProcessor*);
}

クエリは次のようになります。

var outputRows = from inputRow in inputTable.AsEnumerable()
                 from row2 in GetOutputRows(inputRow)
                 select row2;
于 2012-11-08T13:58:26.763 に答える
0

linqのselectステートメントは、一度に1つのオブジェクトしか選択できません。ただし、グループを選択して、後でユニオンを実行することはできます。
結果は次のようになります。

        public static void test()
        {
            var data = new List<String>{"a","b","c","d"};
            var outputRows = from inputRow in data
                             select Expand(inputRow);
            var result = new List<String>();
            outputRows.ToList().ForEach(r=>result = r.Union(result).ToList());
        }

        private static List<String> Expand(string data)
        {
            var subdata = new List<String>();
            subdata.Add(data + "1");
            subdata.Add(data + "2");
            return subdata;
        }
于 2012-11-08T13:04:35.253 に答える
0

これはどうですか:

private IEnumerable<OutputRow> BuildOutputTable(DataTable inputTable)
{
    var tmp = from inputRow in inputTable.AsEnumerable()
              select new { x = getProcessedRows(inputRow)};
    var outputRows = tmp.SelectMany(x=>x.x);
    return outputRows;
}

private IEnumerable<OutputRow> getProcessedRows(YourInputRowType inputRow)
{
    List<OutputRow> ret = new List<OutputRow>()
    /* some logic here to generate the output rows for this input row */
    return ret;
}
于 2012-11-08T13:32:46.167 に答える