Hi2,
如何从List<Tuple<double, double>> tupleList
中获取最小值和最大值?
我知道我可以通过在List<double> onlyList
中获得min或min
onlyList.Max();
onlyList.Min();
但是List with Tuple怎么样?我应该将元组解析为一个新列表,然后调用";最大((/最小((">
例如,如果我有这个
tupleList.Add(new Tuple<double, double>(11, 3));
tupleList.Add(new Tuple<double, double>(10, 5));
tupleList.Add(new Tuple<double, double>(12, 2));
tupleList.Add(new Tuple<double, double>(13, 0));
tupleList.Add(new Tuple<double, double>(15, 4));
tupleList.Add(new Tuple<double, double>(14, 1));
我想比较每个元组中的第一个双精度(从10到15(,得到10和15作为min和max,然后比较每个元组(从0到5(中的第二个双精度,得到0和5分别作为min和max。
谢谢你们的真知灼见!^^,
如果您想要元组列表中任何值的最小值/最大值,您可以执行:
onlyList.Min(t => t.Item1 < t.Item2 ? t.Item1 : t.Item2);
onlyList.Max(t => t.Item1 > t.Item2 ? t.Item1 : t.Item2);
如果您需要第一个或第二个项目的最大值,请使用
onlyList.Max(t => t.Item1);
对于CCD_ 3也是类似的。
还有其他方法-创建一个";扁平的";列出所有项目(例如使用SelectMany
(并调用max等。使用对您最有意义的内容。除非您对列表进行多次迭代,否则我不会期望有显著的性能差异。
public (double, double) Min(IEnumerable<(double, double)> items)
{
(double, double) result = (int.MaxValue, int.MaxValue);
foreach(var item in items)
{
result.Item1 = Math.Min(result.Item1, item.Item1);
result.Item2 = Math.Min(result.Item2, item.Item2);
}
return result;
}
public (double, double) Max(IEnumerable<(double, double)> items)
{
(double, double) result = (int.MinValue, int.MinValue);
foreach(var item in items)
{
result.Item1 = Math.Max(result.Item1, item.Item1);
result.Item2 = Math.Max(result.Item2, item.Item2);
}
return result;
}
var tupleList = new List<(double, double)> {
(11,3),
(10,5),
(12,2),
(13,0),
(15,4),
(14,1)
};
var minResult = Min(tupleList);
var maxReslut = Max(tupleList);
或者:
var tupleList = new List<(double, double)> {
(11,3),
(10,5),
(12,2),
(13,0),
(15,4),
(14,1)
};
var minResult = (tupleList.Min(i => i.Item1), tupeList.Min(i => i.Item2));
var maxResult = (tupleList.Max(i => i.Item1), tupeList.Max(i => i.Item2));
上面的代码要少得多,但它是通过列表的四个单独的过程,而不是只有两个。