2014-10-30 33 views
0

我問下面的問題。我得到了答案。如何使用LINQ:如果有幾個最小值和最大值,只刪除列表中的一個最小值和最大值

How to use a LINQ in order to remove Min and Max value in List

不過,我有這樣的情況的問題有幾個分和列表最大值。 我想要使用LINQ表達式來刪除列表中只有一個最小值和最大值。

代碼片斷:

namespace ConsoleApplication_lamdaTest 
{ 
    public struct TValue 
    { 
     public double x, y; 
     public double value { get { return Math.Sqrt(x * x + y * y); } } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      List<TValue> temp = new List<TValue> { 
       new TValue { x = 1, y =2 }, 
       new TValue { x = 3, y =4 }, 
       new TValue { x = 4, y =3 }, 
       new TValue { x = 3, y =1 }, 
       new TValue { x = 2, y =3 }, 
       new TValue { x = 1, y =4 }, 
       new TValue { x = 1, y =2 }, 
       new TValue { x = 1, y =2 } 
      }; 

      foreach(TValue item in temp) 
       Console.WriteLine(item.value.ToString()); 

      var newValue = from pair in temp 
          where pair.value < temp.Max(m => m.value) && pair.value > temp.Min(m => m.value) 
          select pair; 

      foreach (TValue item in newValue) 
       Console.WriteLine(item.value.ToString()); 

      Console.ReadKey(); 
     } 
    } 
} 

輸出;

2.23606797749979 
5 
5 
3.16227766016838 
3.60555127546399 
4.12310562561766 
2.23606797749979 
2.23606797749979 
------------------- 
3.16227766016838 
3.60555127546399 
4.12310562561766 

但是,我想得到如下的輸出;

2.23606797749979 
5 
5 
3.16227766016838 
3.60555127546399 
4.12310562561766 
2.23606797749979 
2.23606797749979 
------------------- 
5 
3.16227766016838 
3.60555127546399 
4.12310562561766 
2.23606797749979 
2.23606797749979 

我在想幾個步驟來解決這個問題。使用LINQ:可以使用LINQ嗎?

1. Sorting 
2. Remove First and Last index 

代碼片段:任何幫助?

var newSortedValue = from pair in temp 
           orderby pair.value descending 
           where pair = temp.RemoveAt(0) && pair = temp.RemoveAt(temp.Count()-1) 
           select pair; 
+0

不要以爲只有Linq才能做任何事情。 – DavidG 2014-10-30 11:06:59

+1

在您的有序列表中,您希望[跳過](http://msdn.microsoft.com/library/bb357513.aspx)第一個元素,然後[take](http://msdn.microsoft.com/library/ bb300906.aspx)除了最後一個元素之外的所有東西,對吧?所以'orderedList.Skip(1).Take(orderedList.Count() - 2)'應該做的。 – Corak 2014-10-30 11:10:04

回答

2

排序和刪除第一個和最後一個值應該工作得很好。你可以那樣做:

var tempWithoutMinAndMax = temp.OrderBy(m => m.value).Skip(1).Take(temp.Count-2); 

//編輯:我很好奇,拉希德·阿里的解決方案(下),所以我決定進行一個快速測試。我創建的列表與10個000元素:

var list = new List<KeyValuePair<int, int>>(); 
for(int i=0;i<10000;i++) 
{ 
    list.Add(new KeyValuePair<int, int>(i,random.Next())); 
} 

然後,我使用這兩種方法除去單個最小值和最大值元件從列表和測量的時間。我的測試代碼:

Stopwatch watch = new Stopwatch(); 
watch.Start(); 
var ver1 = list.OrderBy(m => m.Value).Skip(1).Take(list.Count - 2).ToList(); 
watch.Stop(); 
var ver1time = watch.ElapsedMilliseconds; 
watch.Reset(); 
watch.Start(); 
list.Remove(list.Where(x => x.Value == list.Max(y => y.Value)).First()); 
list.Remove(list.Where(x => x.Value == list.Min(y => y.Value)).First()); 
watch.Stop(); 
var ver2time = watch.ElapsedMilliseconds; 
Console.WriteLine("First method (order by): {0}ms\nSecond method (remove): {1}ms", 
ver1time,ver2time); 

結果:第一種方法(按順序):爲11ms,第二種方法(刪除):3424ms 我跑這個測試了幾次,所有結果相似。我沒有檢查什麼的IL代碼目錄操作搜索方法產生,但很明顯,使用排序依據優於結合刪除,在哪裏以及最小/最大

0

這裏得到的結果設定您想要而不執行排序依據操作的另一種方式:

temp.Remove(temp.Where(x => x.value == temp.Max(y => y.value)).First()); 
temp.Remove(temp.Where(x => x.value == temp.Min(y => y.value)).First()); 
相關問題