2014-10-10 94 views
1

C#提供了一種方式來獲得的第一個匹配項的索引:獲取隨機匹配值的指數

int first = myList.IndexOf(myList.Min()) 

和一種方式來獲得的最後一個索引:

int last = myList.LastIndexOf(myList.Min()) 

什麼是最簡單的方法得到一個匹配值的隨機索引,如:

int anyOldOne = myList.RandomIndexOf(myList.Min()) 

回答

3

您可以獲取所有索引並選擇一個隨機索引:

// Do this once only 
var rnd = new Random(); 

// Do this each time you want a random element. 
var key = myList.Min(); 
var indices = mylist 
      .Select((n,index) => new { n, index }) 
      .Where(x => x.n == key) 
      .Select(x => x.index) 
      .ToList(); 
int anyOldOne= indices[rnd.Next(indices.Count)]; 

當然這會在方法中看起來更好。

+4

注意,你不想在每次你這樣做的時候調用'new Random',實際上 - 見http://csharpindepth.com/Articles/第12章/ Random.aspx – 2014-10-10 09:51:41

0

也許:

,你不應該在自 Random循環調用此
int min = myList.Min(); 
var allIndicesWithThatValue = myList 
    .Select((i, index) => new { value = i, index }) 
    .Where(x => x.value == min); 
Random rnd = new Random(); 
int randomIndex = allIndicesWithThatValue 
    .ElementAt(rnd.Next(allIndicesWithThatValue.Count())).index; 

注意與CURENT時間播種。在這種情況下,您應該重複使用相同的Random實例。否則,您將始終獲得相同的索引。

1

你可以試試這個,我已經創造了一個擴展方法,它可以直接使用像你問的問題: -

擴展方法: -

public static int RandomIndexOf<T>(this IList<T> sequence, T element) 
     { 
      Random rnd = new Random(); 
      List<int> matchedIndexs = new List<int>(); 
      for (int i = 0; i < sequence.Count; i++) 
      { 
       if (sequence[i].Equals(element)) 
        matchedIndexs.Add(i); 
      } 
      return matchedIndexs[rnd.Next(matchedIndexs.Count)]; 
     } 

然後你可以使用它只是: -

  //Dummy Data Source 
      List<int> myList = new List<int> { 4, 1, 5, 7, 1, 2, 1, 4, 1, 4, 6, 1, 1 }; 
      int random = myList.RandomIndexOf(myList.Min());