大家好! 如何在C#中获取特定范围内的int数组的最小值? 例如: int [] array = new int {1,2,3,4,5,6,7,8,76,45}; 我希望在第3和第8个元素之间获得最小值。 也许有可能通过LINQ查询?
答案 0 :(得分:13)
array.Skip(2).Take(5).Min();
答案 1 :(得分:6)
我想我也可以加入我的tuppence。由于Jason反对这样一个事实:我们说的是我们跳过了多少而不是结束索引,我们可以添加一个简单的扩展方法:
public static IEnumerable<T> WithIndexBetween<T>(this IEnumerable<T> source,
int startInclusive, int endExclusive)
{
// The two values can be the same, yielding no results... but they must
// indicate a reasonable range
if (endExclusive < startInclusive)
{
throw new ArgumentOutOfRangeException("endExclusive");
}
return source.Skip(startInclusive).Take(endExclusive - startInclusive);
}
然后:
int min = array.WithIndexBetween(2, 7).Min();
调整扩展方法名称以尝试。 (命名很难,而且我不会花很多时间在这里找到一个好的:)
答案 2 :(得分:3)
int min = array.Where((value, index) => index >= 2 && index <= 7).Min();
修改
实际上,上面的方法是非常低效的,因为它列举了整个序列,即使我们对索引高于7的项目不感兴趣。更好的解决方案是使用TakeWhile
:
int min = array.TakeWhile((value, index) => index <= 7).Skip(2).Min();
不幸的是,它不是非常易读......使其更好的最佳选择可能是创建自定义扩展方法,如Jon的回答所示。
答案 3 :(得分:2)
int[] arr = {0,1,2,3,4,5,6,7,8};
int start = 3;
int end = 8;
int min = arr.Skip(start - 1).Take(end - start).Min();
答案 4 :(得分:2)
只是添加另一个选项:
int start = 3;
int end = 8;
var min = Enumerable.Range(start - 1,end - start).Select(idx => array[idx]).Min();
AFAIK,如果你必须接近一个范围的一个范围,这在理论上是更快的,你的阵列真的很长。
那是因为(再次AFAIK)Skip()
没有考虑到这是一个数组(即可以在O(1)中随机访问)并且无论如何都要枚举它。
答案 5 :(得分:0)
array.Skip(3).Take(4).Min();
答案 6 :(得分:0)
就个人而言,我更喜欢这个:
public static class ArrayExtensions {
public static bool ArrayAndIndexesAreValid(
T[] array,
int startInclusive,
int endExclusive
) {
return array != null &&
array.Length > 0 &&
startInclusive >= 0 && startInclusive < array.Length &&
endExclusive >= 1 && endExclusive <= array.Length &&
startInclusive < endExclusive;
}
public static IEnumerable<T> Slice<T>(
this T[] array,
int startInclusive,
int endExclusive
) {
Contract.Requires<ArgumentException>(ArrayAndIndexesAreValid(
array,
startInclusive,
endExclusive)
);
for (int index = startInclusive; index < endExclusive; index++) {
yield return array[index];
}
}
public static T MinimumInIndexRange<T>(
this T[] array,
int startInclusive,
int endExclusive
) where T : IComparable {
Contract.Requires<ArgumentException>(ArrayAndIndexesAreValid(
array,
startInclusive,
endExclusive)
);
return array.Slice(startInclusive, endExclusive).Min();
}
public static T MaximumInIndexRange<T>(
this T[] array,
int startInclusive,
int endExclusive
) where T : IComparable {
Contract.Requires<ArgumentException>(ArrayAndIndexesAreValid(
array,
startInclusive,
endExclusive)
);
return array.Slice(startInclusive, endExclusive).Max();
}
}