[英]How to use a LINQ : If there are several min and max values, just remove only one min and max value in List
我问了以下问题。 我得到了答案。
但是,在这种情况下,我有一个问题,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.