2013-11-27 71 views
1

我下面如何使用LINQ找到MIN()和閔元素設置爲0

 List<decimal> Prices = new List<decimal>(); 
     Prices.Add(999.99M); 
     Prices.Add(19.99M); 
     Prices.Add(2.75M); 
     Prices.Add(9.99M); 
     Prices.Add(2.99M); 
     Prices.Add(2.99M); 
     Prices.Add(99.99M); 

我可以使用LINQ通過

 decimal Min = Prices.Min(r => r); 

但是,如何才能獲得的最小值我在當前列表中將最小值設置爲0?

UPDATE

我該如何處理兩個最小的價格爲2.99例如2.99和,我只是想設置1到0

回答

9
 List<decimal> Prices = new List<decimal>(); 
     Prices.Add((decimal)999.99); 
     Prices.Add((decimal)19.99); 
     Prices.Add((decimal)2.75); 
     Prices.Add((decimal)9.99); 
     Prices.Add((decimal)2.99); 
     Prices.Add((decimal)99.99); 

     decimal minimum = Prices.Min(); 
     Prices = Prices.Select(price => price > minimum ? price : 0).ToList(); 

這將設置爲0。

更新所有的價格等於最小值

我該如何處理兩個最小的價格爲2.99例如2.99和,我只希望設置1爲0

好吧,當這個需求被添加到等式中時,@ lazyberezovsky's(暫時刪除,現在未刪除)解決方案對您來說是正確的:

Prices[Prices.IndexOf(Prices.Min())] = 0; 
4
var prices = new List<decimal> { 
    999.99M, 19.99M, 2.75M, 9.99M, 2.99M, 99.99M }; 

Prices[Prices.IndexOf(Prices.Min())] = 0; 

如果要更新所有分價格:

var min = Prices.Min(); 

for (int i = 0; i < Prices.Count; i++) 
    if (Prices[i] == min) 
     Prices[i] = 0; 

注意:您不必選擇進入Enumerable.Min()方法,你可以用後綴M聲明小數升,並且可以使用集合初始化填補價格清單。

+1

是的,但一個以上的價格可能有最低值(即在OP想設置爲0 ),而'Prices.IndexOf'只返回一個索引。 –

+0

@KonradMorawski同意,用循環 –

+0

更新但事實證明,您的原始解決方案是OP實際需要的東西:)只是第一個最低價格。起初他沒有具體說明這個要求,但這就是他的意思,請看最新的問題。 –

2

在LINQ可以做到這一點(它會設置所有最低價格爲0)

var min = Prices.Min(); 
Prices = Prices.Select(x=> x==min? 0:x).ToList(); 
+0

請將'Prices.Min()'移到循環外部。 –

+0

你會意識到,這將有最糟糕的表現,因爲你將有n^2次循環的迭代。最低價格,最快時間! –

+0

是的,當然我忘了提取它,謝謝 – wudzik