2012-05-26 61 views
2

我有一個100個整數的數組a。在a[3]a[70]中找到最小值的推薦方法是什麼,以及這個最小值的指數是?假定不重複值。在數組的子集中找到最小值的優雅方法是什麼?

我知道通過指數的相關範圍內循環的方式笨拙:

for(i = 3; i < 70, i++) 
{ 
    ... 
} 

我要尋找一個在C#這樣做,而不是循環的一個更優雅的方式。謝謝。

+1

如果只有'ArraySegment '是枚舉... – Mehrdad

+0

@Mehrdad如何區別,如果是枚舉?謝謝。 – RJIGO

+1

那麼你可以只說'foreach(var ArraySegment中的新項目(arr,3,70))''它會擺脫'i'。 – Mehrdad

回答

6

找出分鐘

List<int> templist = a.Skip(3).Take(67).ToList(); 

int minimum = templist.Min(); 

對於指數

int index = templist.FindIndex(i => i == minimum) + 3; 

我加3,因爲在列表索引會比3少指數按照原來的順序a

它在做什麼

  1. 跳過 - 葉第一3個值,即索引0,1,2和返回剩餘的陣列。
  2. Take - 從Skip返回的數組中獲取67個值。 (因爲你的for循環從3開始,直到70,所以你基本上循環67項bcoz 70 - 3 = 67)。
  3. ToList - 將返回的序列轉換爲List以查找索引。
  4. 最小 - 獲取最小值。

你必須使用循環,因爲它是一個序列。既然你說優雅,所以而不是循環我使用LINQ(即使它也循環)。

+0

你怎麼知道這個最小值的哪個指數?我認爲,聲明只是給了我最小的。謝謝。 – RJIGO

+0

@RJIGO:你想要這個值的所有索引還是第一個索引? –

+0

只是第一個索引,因爲沒有值的重複。 – RJIGO

3

如果你的數據結構未排序那麼有沒有辦法做到這一點,而無需通過在子列表中的所有元素循環,無論是如果你使用一些隱式的循環,通過所提供的API。

你不能使用排序後的集合,因爲你正在處理它的一個子部分(所以你需要爲列表部分創建一個排序後的集合),所以無論如何你必須循環它。

1

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基元組並使用它來代替匿名類型,它將與更高效的直接迭代相媲美,因爲它不會分配任何額外的內存。

相關問題