C#提供了一種方式來獲得的第一個匹配項的索引:獲取隨機匹配值的指數
int first = myList.IndexOf(myList.Min())
和一種方式來獲得的最後一個索引:
int last = myList.LastIndexOf(myList.Min())
什麼是最簡單的方法得到一個匹配值的隨機索引,如:
int anyOldOne = myList.RandomIndexOf(myList.Min())
C#提供了一種方式來獲得的第一個匹配項的索引:獲取隨機匹配值的指數
int first = myList.IndexOf(myList.Min())
和一種方式來獲得的最後一個索引:
int last = myList.LastIndexOf(myList.Min())
什麼是最簡單的方法得到一個匹配值的隨機索引,如:
int anyOldOne = myList.RandomIndexOf(myList.Min())
您可以獲取所有索引並選擇一個隨機索引:
// 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)];
當然這會在方法中看起來更好。
也許:
,你不應該在自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
實例。否則,您將始終獲得相同的索引。
你可以試試這個,我已經創造了一個擴展方法,它可以直接使用像你問的問題: -
擴展方法: -
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());
注意,你不想在每次你這樣做的時候調用'new Random',實際上 - 見http://csharpindepth.com/Articles/第12章/ Random.aspx – 2014-10-10 09:51:41