Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用linq并从datatable和where子句中仅选择一个值的总和(字段)?_C#_.net_Linq_Datatable - Fatal编程技术网

C# 如何使用linq并从datatable和where子句中仅选择一个值的总和(字段)?

C# 如何使用linq并从datatable和where子句中仅选择一个值的总和(字段)?,c#,.net,linq,datatable,C#,.net,Linq,Datatable,这就是我的数据表的外观 我想找到Y列的值,其中X列的值是B 我正在尝试使用linq编写上述代码,但我并不擅长 所以我就是这么做的 X Y Z E ------------------ A 4.8 0 0 B 1 0 0 C 8.52763 0 0 decimaltotalvalue=(十进制)0.0; TotalValue=Convert.ToDecimal(dt.AsEnumerable() 其中(x=>x.Field(“x

这就是我的数据表的外观

我想找到Y列的值,其中X列的值是B

我正在尝试使用linq编写上述代码,但我并不擅长

所以我就是这么做的

X    Y      Z   E 
------------------
A   4.8     0   0 
B   1       0   0
C   8.52763 0   0
decimaltotalvalue=(十进制)0.0;
TotalValue=Convert.ToDecimal(dt.AsEnumerable()
其中(x=>x.Field(“x”).ToString()==“B”)
.选择(p=>p.Field(“Y”).ToString());
注意:所有的X、Y、Z、E列都是数据类型字符串。dt是包含上述数据的数据表


有人能告诉我我的代码有什么问题吗

您将获得
X
B
的所有值。使用
FirstOrDefault
获取第一个匹配项

SingleOrDefault
相比,存在一些性能问题。从

FirstOrDefault
-通常更快,它会迭代直到找到元素,并且只需在找不到元素时迭代整个可枚举项。在许多情况下,找到物品的概率很高

SingleOrDefault
-需要检查是否只有一个元素,因此始终迭代整个可枚举项。确切地说,它会迭代,直到找到第二个元素并抛出异常

Decimal TotalValue = (Decimal) 0.0;


TotalValue = Convert.ToDecimal(dt.AsEnumerable()
.Where(x => x.Field<string>("X").ToString()=="B")
.Select(p => p.Field<string>("Y").ToString()));
TotalValue=Convert.ToDecimal(dt.AsEnumerable()
其中(x=>x.Field(“x”).ToString()==“B”)
.Select(p=>p.Field(“Y”).ToString()).FirstOrDefault();

您将获得
X
B
的所有值。使用
FirstOrDefault
获取第一个匹配项

SingleOrDefault
相比,存在一些性能问题。从

FirstOrDefault
-通常更快,它会迭代直到找到元素,并且只需在找不到元素时迭代整个可枚举项。在许多情况下,找到物品的概率很高

SingleOrDefault
-需要检查是否只有一个元素,因此始终迭代整个可枚举项。确切地说,它会迭代,直到找到第二个元素并抛出异常

Decimal TotalValue = (Decimal) 0.0;


TotalValue = Convert.ToDecimal(dt.AsEnumerable()
.Where(x => x.Field<string>("X").ToString()=="B")
.Select(p => p.Field<string>("Y").ToString()));
TotalValue=Convert.ToDecimal(dt.AsEnumerable()
其中(x=>x.Field(“x”).ToString()==“B”)
.Select(p=>p.Field(“Y”).ToString()).FirstOrDefault();

因此,您的数据源保留了一个对象集合,其中每个对象都有属性X/Y/Z/E。或者,在数据库术语中,您有一个至少包含列X Y Z E的表

您可能知道如何获取此集合的行

   TotalValue = Convert.ToDecimal(dt.AsEnumerable()
    .Where(x => x.Field<string>("X").ToString()=="B")
    .Select(p => p.Field<string>("Y").ToString()).FirstOrDefault());
在您的情况下,您只希望保留X值为“B”的项目。因此,您的
位置将是:

List<MyData> sourceCollection = FetchData();
List<MyData> resultCollection = new List<MyData>()
foreach (MyData x in sourceCollection)
{
    if ( F(x) ) 
        resultCollection.Add(x); // = Keep the item
    // else Don't keep the it
}
每当要将集合中的每个项目转换为不同的对象时,请使用Linq Select:

.Where(fetchedItem => fetchedItem.X == "B")
这里F(x)是一个函数,它从源集合中获取一个元素,并将其转换为输出类型的对象

它类似于:

class MyData
{
     public string X {get; set;}
     public decimal Y {get; set;}
     public int Z {get; set;}
     public int E {get; set;}
}

IEnumerable<MyData> fetchedData = FetchMyData(...);
// this is where you get the data from the table which creates for instance
// your example.
.Select( x => F(x))
因此,总的结果将是:

var resultCollection = new List<...>()
foreach (var item in sourceCollection)
{
    var resultItem = F(item);
    resultCollection.Add(resultItem);
}
.Select(fecthedItem => fetchedItem.Y);
换句话说:从序列
fetchedData
,只取a
fetchedItem.X
等于“B”的元素。从其余集合中,仅从每个元素中获取属性Y的值


简单的问候!(一旦您知道如何操作)

因此,您的数据源保留一个对象集合,其中每个对象都有属性X/Y/Z/E。或者,在数据库术语中,您有一个至少包含列X Y Z E的表

您可能知道如何获取此集合的行

   TotalValue = Convert.ToDecimal(dt.AsEnumerable()
    .Where(x => x.Field<string>("X").ToString()=="B")
    .Select(p => p.Field<string>("Y").ToString()).FirstOrDefault());
在您的情况下,您只希望保留X值为“B”的项目。因此,您的
位置将是:

List<MyData> sourceCollection = FetchData();
List<MyData> resultCollection = new List<MyData>()
foreach (MyData x in sourceCollection)
{
    if ( F(x) ) 
        resultCollection.Add(x); // = Keep the item
    // else Don't keep the it
}
每当要将集合中的每个项目转换为不同的对象时,请使用Linq Select:

.Where(fetchedItem => fetchedItem.X == "B")
这里F(x)是一个函数,它从源集合中获取一个元素,并将其转换为输出类型的对象

它类似于:

class MyData
{
     public string X {get; set;}
     public decimal Y {get; set;}
     public int Z {get; set;}
     public int E {get; set;}
}

IEnumerable<MyData> fetchedData = FetchMyData(...);
// this is where you get the data from the table which creates for instance
// your example.
.Select( x => F(x))
因此,总的结果将是:

var resultCollection = new List<...>()
foreach (var item in sourceCollection)
{
    var resultItem = F(item);
    resultCollection.Add(resultItem);
}
.Select(fecthedItem => fetchedItem.Y);
换句话说:从序列
fetchedData
,只取a
fetchedItem.X
等于“B”的元素。从其余集合中,仅从每个元素中获取属性Y的值


简单的问候!(一旦你知道怎么做)

这对我很有效,谢谢。但是,如果数据表中出现多个“B”,有没有办法将它们相加并将其分配给变量?是的,您可以使用
sum
方法来代替
FirstOrDefault
方法。这对我很有效,谢谢。但如果数据表中出现多个“B”,是否有方法将它们相加并将其分配给变量?是的,您可以使用
sum
方法代替
FirstOrDefault
方法。如果数据表中出现多个“B”,是否有方法将它们全部相加并分配给变量?如果数据表中出现多个“B”,是否有方法将它们相加并分配给变量?