C# 如何使用linq并从datatable和where子句中仅选择一个值的总和(字段)?
这就是我的数据表的外观 我想找到Y列的值,其中X列的值是B 我正在尝试使用linq编写上述代码,但我并不擅长 所以我就是这么做的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
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
,只取afetchedItem.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
,只取afetchedItem.X
等于“B”的元素。从其余集合中,仅从每个元素中获取属性Y的值
简单的问候!(一旦你知道怎么做)这对我很有效,谢谢。但是,如果数据表中出现多个“B”,有没有办法将它们相加并将其分配给变量?是的,您可以使用sum
方法来代替FirstOrDefault
方法。这对我很有效,谢谢。但如果数据表中出现多个“B”,是否有方法将它们相加并将其分配给变量?是的,您可以使用sum
方法代替FirstOrDefault
方法。如果数据表中出现多个“B”,是否有方法将它们全部相加并分配给变量?如果数据表中出现多个“B”,是否有方法将它们相加并分配给变量?