C#提供了获取第一个匹配条目索引的方法:
int first = myList.IndexOf(myList.Min())
以及获取最后一个索引的方法:
int last = myList.LastIndexOf(myList.Min())
获取匹配值的随机索引的最简单方法是:
int anyOldOne = myList.RandomIndexOf(myList.Min())
答案 0 :(得分: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)];
当然,这在方法中看起来会更好。
答案 1 :(得分: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());
答案 2 :(得分:0)
也许:
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;
请注意,您不应该在循环中调用此方法,因为Random
以固有时间播种。在这种情况下,您应该重用相同的Random
实例。否则,您将始终获得相同的索引。