0

2つの列を持つDatatable「tblFields」があり、その値は次のとおりです。

FieldId     FieldValue
-------     ----------
0_Name      test0
0_Amount    100
1_Name      test1
1_Amount    100
2_Name      test2
2_Amount    200
3_Name      test3
3_Amount    0.00
4_Name      test4
4_Amount    

以下のlinqは、データテーブルの「0_」で始まらないすべての行を表示します。次に、このコレクションにフィルターを適用して、量(_Amount)が0.00に等しくないか空の行のみを取得する必要があります。また、_Amountが0.00に等しいか空の場合は、_Name行を除外する必要があります。

var pairs = from row in tblFields.AsEnumerable()
                        where !row.Field<string>("FieldId").StartsWith("0_")
                        select new
                        {
                            key = GetId(row.Field<string>("FieldId")),
                            value = row.Field<string>("FieldValue")
                        };

次のような出力を探しています。linqを使用してこの結果を取得することは可能ですか?誰かがこれを達成するための他の方法を知っていますか?アイデアをありがとう。

1_Name      test1
1_Amount    100
2_Name      test2
2_Amount    200
4

2 に答える 2

1

Field<T>これは機能するはずです(メソッドがタイプTを返し、数値タイプで機能すると仮定します):

var pairs = from row in tblFields.AsEnumerable()
            where !row.Field<string>("FieldId").StartsWith("0_")
            let value = row.Field<decimal>("FieldValue")
            where value != 0.00M
            select new
            {
                Id = row.Field<string>("FieldId"),
                Value = value
            }

Field<T>メソッドが数値タイプで機能しない場合は、次のことを試してください。

var pairs = from row in tblFields.AsEnumerable()
            where !row.Field<string>("FieldId").StartsWith("0_")
            let fieldValueString  = row.Field<string>("FieldValue")
            let value = String.IsNullOrEmpty(fieldValueString)? 0M : Decimal.Parse(fieldValueString)
            where value != 0.00M
            select new
            {
                Id = row.Field<string>("FieldId"),
                Value = value
            }

ここでは、フィールドIDと値の両方を削除する必要がありますが、形式は少し異なります(ただし単純です)。

var pair= from row in tblFields.AsEnumerable()
          group row by row.Field<string>("FieldId")[0] into idValueGroup
          where idValueGroup.Key != "0"
          select new
          {
              IdLine = idValueGroup.ElementAt(0),
              ValueLine = idValueGruop.ElementAt(1)
          } into linePair
          where linePair.ValueLine.Field<decimal>("FieldValue") != 0.00M
          select new
          {
              NameId = linePair.IdLine.Field<string>("FieldId"),
              Name = linePair.IdLine.Field<string>("FieldValue"),
              ValueId = linePair.ValueLine.Field<string>("FieldId"),
              Value = linePair.ValueLine.Field<decimal>("FieldValue")
          }
于 2012-07-26T20:03:56.720 に答える
0

あなたはこれを行うことができます

var pairs = from row in tblFields.AsEnumerable()
                    where !row.Field<string>("FieldId").StartsWith("0_")
                    && row.Field<string>("FieldValue") != "0.00"
                    select new
                    {
                        key = GetId(row.Field<string>("FieldId")),
                        value = row.Field<string>("FieldValue")
                    };

テストコード

public class MyObject
{
    public string FieldId      { get; set; }
    public string FieldValue { get; set; }
}


List<MyObject> list = new List<MyObject> {
    new MyObject { FieldId = "0_Name", FieldValue = "test0"},
    new MyObject { FieldId = "1_Name", FieldValue = "test1" },
    new MyObject { FieldId = "2_Name", FieldValue = "test2" }
};

var pairs = from row in list
            where !row.FieldId.StartsWith("0_")
            && row.FieldValue != "0.00")
            select new
            {
                key = row.FieldId,
                value = row.FieldValue
            };
于 2012-07-26T19:29:35.650 に答える