簡體   English   中英

LINQ的使用方法:如果有多個最小值和最大值,則只需在列表中刪除一個最小值和最大值

[英]How to use a LINQ : If there are several min and max values, just remove only one min and max value in List

我問了以下問題。 我得到了答案。

如何使用LINQ以刪除列表中的最小值和最大值

但是,在這種情況下,我有一個問題,List中有幾個最小值和最大值。 我想使用LINQ表達式,以便僅刪除List中的一個min和Max值。

程式碼片段:

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;

排序和刪除第一個和最后一個值應該可以正常工作。 您可以這樣做:

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

//編輯:我很好奇Rashid Ali的解決方案(如下),所以我決定進行一次快速測試。 我創建了一個包含10000個元素的列表:

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

然后,我使用這兩種方法從列表中刪除了單個Min和Max元素,並測量了時間。 我的測試代碼:

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代碼earch方法,但顯然使用OrderBy優於組合Remove,Where和Min / Max的方法

這是無需執行orderby操作即可獲取所需結果集的另一種方法:

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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM