C# 如何对可枚举集合应用筛选器?

C# 如何对可枚举集合应用筛选器?,c#,c#-3.0,C#,C# 3.0,我有一个数据表“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 下面的li

我有一个数据表“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或为空的唯一行。此外,当_金额等于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")
                        };
你可以这样做

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")
                    };
var pairs=来自tblFields.AsEnumerable()中的行
哪里行字段(“字段ID”).StartsWith(“0”)
&&行.字段(“字段值”)!="0.00"
选择新的
{
key=GetId(row.Field(“FieldId”)),
值=行字段(“字段值”)
};
测试代码
公共类MyObject
{
公共字符串字段ID{get;set;}
公共字符串字段值{get;set;}
}
列表=新列表{
新的MyObject{FieldId=“0_Name”,FieldValue=“test0”},
新的MyObject{FieldId=“1_Name”,FieldValue=“test1”},
新的MyObject{FieldId=“2_Name”,FieldValue=“test2”}
};
var pairs=来自列表中的行
哪里row.FieldId.StartsWith(“0”)
&&row.FieldValue!="0.00")
选择新的
{
key=row.FieldId,
value=row.FieldValue
};
这应该可以工作(假设
字段
方法返回类型T,并且它可以与数字类型一起工作):

var pairs=来自tblFields.AsEnumerable()中的行
哪里行字段(“字段ID”).StartsWith(“0”)
让值=行字段(“字段值”)
价值何在!=0.00米
选择新的
{
Id=行字段(“字段Id”),
价值=价值
}
如果
字段
方法不适用于数字类型,请尝试以下操作:

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
            }
var pairs=来自tblFields.AsEnumerable()中的行
哪里行字段(“字段ID”).StartsWith(“0”)
让fieldValueString=row.Field(“FieldValue”)
让value=String.IsNullOrEmpty(fieldValueString)?0M:Decimal.Parse(fieldValueString)
价值何在!=0.00米
选择新的
{
Id=行字段(“字段Id”),
价值=价值
}
在这里,它应该删除字段ID和值,但格式略有不同(但仍然很简单):

var pair=来自tblFields.AsEnumerable()中的行
逐行将字段(“FieldId”)[0]分组到idValueGroup中
其中idValueGroup.Key!="0"
选择新的
{
IdLine=idValueGroup.ElementAt(0),
ValueLine=idValueGruop.ElementAt(1)
}成线对
其中linePair.ValueLine.Field(“FieldValue”)!=0.00米
选择新的
{
NameId=linePair.IdLine.Field(“FieldId”),
Name=linePair.IdLine.Field(“FieldValue”),
ValueId=linePair.ValueLine.Field(“FieldId”),
Value=linePair.ValueLine.Field(“FieldValue”)
}

问题要求根据金额筛选出3和4,但您只是对所需的数字进行硬编码。通过编辑,它仍然不起作用,因为您没有筛选出3\u名称、4\u名称或4\u金额。您的测试代码实际上没有测试给定的代码,它测试的是类似的(但不是相同的)使用其他数据集进行查询。感谢提供代码。我仍然不确定当_金额为0.00时如何过滤掉相应的_Name行。我想您显示的代码只会在0.00时过滤掉_Amount。@Jyina它现在应该可以工作了,尽管最终的数据结构略有不同。@Jynia没问题。这就是为什么。
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
            };
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
            }
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
            }
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")
          }