我有一个数组列表,我需要能够点击一个按钮然后从列表中随机挑选一个字符串并显示在消息框中。
我该怎么做呢?
我有一个数组列表,我需要能够点击一个按钮然后从列表中随机挑选一个字符串并显示在消息框中。
我该怎么做呢?
当前回答
或者像这样简单的扩展类:
public static class CollectionExtension
{
private static Random rng = new Random();
public static T RandomElement<T>(this IList<T> list)
{
return list[rng.Next(list.Count)];
}
public static T RandomElement<T>(this T[] array)
{
return array[rng.Next(array.Length)];
}
}
然后只需呼叫:
myList.RandomElement();
也适用于数组。
我将避免调用OrderBy(),因为对于较大的集合来说,它的开销很大。为此,可以使用索引集合,如List<T>或数组。
其他回答
创建一个随机实例:
Random rnd = new Random();
获取一个随机字符串:
string s = arraylist[rnd.Next(arraylist.Count)];
记住,如果你经常这样做,你应该重用随机对象。将它作为类中的静态字段,这样它只初始化一次,然后访问它。
或者像这样简单的扩展类:
public static class CollectionExtension
{
private static Random rng = new Random();
public static T RandomElement<T>(this IList<T> list)
{
return list[rng.Next(list.Count)];
}
public static T RandomElement<T>(this T[] array)
{
return array[rng.Next(array.Length)];
}
}
然后只需呼叫:
myList.RandomElement();
也适用于数组。
我将避免调用OrderBy(),因为对于较大的集合来说,它的开销很大。为此,可以使用索引集合,如List<T>或数组。
Create an instance of Random class somewhere. Note that it's pretty important not to create a new instance each time you need a random number. You should reuse the old instance to achieve uniformity in the generated numbers. You can have a static field somewhere (be careful about thread safety issues): static Random rnd = new Random(); Ask the Random instance to give you a random number with the maximum of the number of items in the ArrayList: int r = rnd.Next(list.Count); Display the string: MessageBox.Show((string)list[r]);
从JSON文件随机打印国家名称。 模型:
public class Country
{
public string Name { get; set; }
public string Code { get; set; }
}
Implementaton:
string filePath = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory, @"..\..\..\")) + @"Data\Country.json";
string _countryJson = File.ReadAllText(filePath);
var _country = JsonConvert.DeserializeObject<List<Country>>(_countryJson);
int index = random.Next(_country.Count);
Console.WriteLine(_country[index].Name);
为什么不[2]:
public static T GetRandom<T>(this List<T> list)
{
return list[(int)(DateTime.Now.Ticks%list.Count)];
}