我有一個100個整數的數組a
。在a[3]
到a[70]
中找到最小值的推薦方法是什麼,以及這個最小值的指數是?假定不重複值。在數組的子集中找到最小值的優雅方法是什麼?
我知道通過指數的相關範圍內循環的方式笨拙:
for(i = 3; i < 70, i++)
{
...
}
我要尋找一個在C#這樣做,而不是循環的一個更優雅的方式。謝謝。
我有一個100個整數的數組a
。在a[3]
到a[70]
中找到最小值的推薦方法是什麼,以及這個最小值的指數是?假定不重複值。在數組的子集中找到最小值的優雅方法是什麼?
我知道通過指數的相關範圍內循環的方式笨拙:
for(i = 3; i < 70, i++)
{
...
}
我要尋找一個在C#這樣做,而不是循環的一個更優雅的方式。謝謝。
找出分鐘
List<int> templist = a.Skip(3).Take(67).ToList();
int minimum = templist.Min();
對於指數
int index = templist.FindIndex(i => i == minimum) + 3;
我加3,因爲在列表索引會比3少指數按照原來的順序a
。
它在做什麼
你必須使用循環,因爲它是一個序列。既然你說優雅,所以而不是循環我使用LINQ(即使它也循環)。
如果你的數據結構未排序那麼有沒有辦法做到這一點,而無需通過在子列表中的所有元素循環,無論是如果你使用一些隱式的循環,通過所提供的API。
你不能使用排序後的集合,因爲你正在處理它的一個子部分(所以你需要爲列表部分創建一個排序後的集合),所以無論如何你必須循環它。
LINQ's Aggregate
並不是最簡單的,但它可以說是「優雅」解決方案中效率最低的(儘管它們的代碼行數比直接循環更多,另外,迭代通過自己仍然是最好的,因爲你沒有分配任何額外的內存)。
但無論如何,你應該覺得有必要讓你的繼任者掛你的肖像,你可以做到這一點,而不是一個簡單的循環:
var minValueAndItsIndex = a
.Skip(3)
.Take(70 - 3)
.Select((value, index) => new { Value = value, Index = index + 3})
.Aggregate((tuple1, tuple2) => (tuple1.Value < tuple2.Value) ? tuple1 : tuple2);
如果創建一個2項ValueType
基元組並使用它來代替匿名類型,它將與更高效的直接迭代相媲美,因爲它不會分配任何額外的內存。
如果只有'ArraySegment'是枚舉... –
Mehrdad
@Mehrdad如何區別,如果是枚舉?謝謝。 – RJIGO
那麼你可以只說'foreach(var ArraySegment中的新項目(arr,3,70))''它會擺脫'i'。 –
Mehrdad