[英]How do i use linq and select just a Sum of values(field) from a datatable along with a where clause?
X Y Z E
------------------
A 4.8 0 0
B 1 0 0
C 8.52763 0 0
這就是我的數據表的外觀,
我想找到X列的值為B的Y列的值。
我正在嘗試使用linq編寫上述代碼,但我並不擅長。
所以這就是我試圖做到的
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()));
注意:所有X,Y,Z,E列均為數據類型字符串。 dt
是具有上述數據的數據表。
有人可以告訴我代碼有什么問題嗎?
您將獲得X
為B
所有值。 使用FirstOrDefault
獲取第一個匹配項。
與SingleOrDefault
相比,存在一些性能問題。 從SingleOrDefault()與FirstOrDefault() 。
FirstOrDefault
-通常是更快,它迭代,直到它找到元素,只需要遍歷整個枚舉,當它沒有找到它。 在許多情況下,找到項目的可能性很高。
SingleOrDefault
-需要檢查,如果只有一個元素,因此總是遍歷整個枚舉。 確切地說,它會進行迭代,直到找到第二個元素並引發異常為止。
TotalValue = Convert.ToDecimal(dt.AsEnumerable()
.Where(x => x.Field<string>("X").ToString()=="B")
.Select(p => p.Field<string>("Y").ToString()).FirstOrDefault());
因此,您的數據源保留了一個對象集合,其中每個對象都具有屬性X / Y / Z / E。或者用數據庫的術語來說,您的表至少具有XYZ E列。
您可能知道如何獲取此集合的行。
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.
列的類型可能會略有不同,但是思路保持不變。
我想找到X列的值為B的Y列的值。
由於這個問題,在我看來您對LINQ來說還很陌生。
在Linq中,只要您只想要源集合中的某些項目,就可以使用Where(...)
where中的x => F(x)部分稱為lambda表達式。 x
是源集合中元素的標識符。 F(x)
是一個布爾表達式,它決定是保留元素還是將其扔掉。 它類似於:
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
}
在您的情況下,您只想保留X值為“ B”的項目。 所以,你Where
將是:
.Where(fetchedItem => fetchedItem.X == "B")
每當您要將集合中的每個項目轉換為不同的對象時,請使用Linq Select:
.Select( x => F(x))
F(x)是從源集合中獲取元素並將其轉換為輸出類型的對象的函數。
它類似於:
var resultCollection = new List<...>()
foreach (var item in sourceCollection)
{
var resultItem = F(item);
resultCollection.Add(resultItem);
}
在您的情況下:您只需要Y列的值。選擇將是:
.Select(fecthedItem => fetchedItem.Y);
因此,總結果將為:
// All Y Where X Equals B:
var allYWhereXEqualsB = fetchedData
.Where(fetchedItem => fetchedItem.X == "B")
.Select(fecthedItem => fetchedItem.Y);
換句話說:從序列fetchedData
,僅采用fetchedItem.X
等於“ B”的那些元素。 從其余集合中,僅從每個元素獲取屬性Y的值。
簡單的漫畫卓悅! (一旦您知道該怎么做)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.