2017-05-11 29 views
3

我想找到一個更短的方式四捨五入List<List<decimal>>中的每個元素,並想知道是否有辦法我可以用Linq縮短它?回合列表的小數列表

我嘗試了幾種方法,比如這個

List<List<Decimal>> masterList = dataSet 
.Select(x => x.Values) 
.ToList() 
.Select(i => Math.Round(i, 2)); 
/// THIS GIVES AN EXCEPTION (CANNOT CONVERT FROM System.Collections.Generic.List<decimal> to 'double' 

這是我目前做的呢?

List<List<Decimal>> masterList = dataSet.Select(x => x.Values).ToList(); 

foreach (var list in masterList) 
{ 
    for(var i = 0; i < list.Count; i++) 
    { 
     list[i] = Math.Round(list[i], 2); 
    } 
} 

回答

3

你應該用Decimal.Round,不Math.Round,做的工作:

masterList = masterList.Select(
    x => x.Select(y => Decimal.Round(y, 2)).ToList() 
    ).ToList(); 

編輯與小數位數(2)。此外,問題似乎在LINQ聲明中,而不是使用Math.RoundDecimal.Round

Decimal.Round是我的首選decimal的情況,尤其是當decimal的值需要轉換爲最短的int。該格式非常方便:Decimal.Round(val)

+0

他可以我們Math.Round了,他只是用它在名單,而不是使用十進制 –

+0

謝謝!知道我做錯了什麼 –

+0

@ S.Petrosov啊是的,只是注意到'Math.Round(dec,MidpointRounding.ToEven)'選項也是。 – Ian

1

下面是一個例子如何使用做LINQ:

List<List<decimal>> list= new List<List<decimal>>(); 
list.Add(new List<decimal>(){ 1.501M,2.231M,3M}); 
list.Add(new List<decimal>(){ 4.505M,5M,3M}); 
list.Add(new List<decimal>(){ 1M,7M,8M}); 
var result = list.Select(x=>x.Select(y=>Math.Round(y,2)).ToList()).ToList(); 
foreach(var a in result) 
{ 
    foreach(var b in a) 
    { 
     Console.Write(b + "\t"); 
    } 
    Console.WriteLine(); 
}