Yanıtlar:
Bir Randomyerde bir sınıf örneği oluşturun . Rastgele bir sayıya her ihtiyacınız olduğunda yeni bir örnek oluşturmamanın oldukça önemli olduğunu unutmayın. Oluşturulan sayılardaki bütünlüğü sağlamak için eski örneği yeniden kullanmalısınız. Bir staticyerde bir alanınız olabilir (iş parçacığı güvenliği sorunlarına dikkat edin):
static Random rnd = new Random();Örnekte, Randomaşağıdakilerdeki maksimum öğe sayısıyla birlikte rastgele bir sayı vermesini isteyin ArrayList:
int r = rnd.Next(list.Count);Dizeyi görüntüle:
MessageBox.Show((string)list[r]);Next(max)özeldir.
Genellikle bu küçük uzantı yöntemlerini kullanıyorum:
public static class EnumerableExtension
{
public static T PickRandom<T>(this IEnumerable<T> source)
{
return source.PickRandom(1).Single();
}
public static IEnumerable<T> PickRandom<T>(this IEnumerable<T> source, int count)
{
return source.Shuffle().Take(count);
}
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source)
{
return source.OrderBy(x => Guid.NewGuid());
}
}
Güçlü yazılan bir liste için bu şunları yazmanıza olanak tanır:
var strings = new List<string>();
var randomString = strings.PickRandom();
Sahip olduğunuz tek şey bir ArrayList ise, yayınlayabilirsiniz:
var strings = myArrayList.Cast<string>();
return list[rnd.Next(list.Count)];
RandomBunun yerine bir örneğini statik durumda tutmayı düşünün .
Yapabilirsin:
list.OrderBy(x => Guid.NewGuid()).FirstOrDefault()
Bir Randomörnek oluşturun :
Random rnd = new Random();
Rastgele bir dize getir:
string s = arraylist[rnd.Next(arraylist.Count)];
Yine de, bunu sık sık yaparsanız Randomnesneyi yeniden kullanmanız gerektiğini unutmayın . Sınıfta statik bir alan olarak yerleştirin, böylece yalnızca bir kez başlatılır ve sonra erişilir.
Veya bunun gibi basit bir uzantı sınıfı:
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)];
}
}
O zaman arayın:
myList.RandomElement();
Diziler için de çalışır.
Daha OrderBy()büyük koleksiyonlar için pahalı olabileceğinden aramaktan kaçınırım . List<T>Bu amaçla dizin veya dizine benzer dizinler kullanın .
IListböylece ikinci aşırı yükleme gereksizdir.
ArrayList ar = new ArrayList();
ar.Add(1);
ar.Add(5);
ar.Add(25);
ar.Add(37);
ar.Add(6);
ar.Add(11);
ar.Add(35);
Random r = new Random();
int index = r.Next(0,ar.Count-1);
MessageBox.Show(ar[index].ToString());
maxValueYöntemin parametresinin Nexteksi bir değil, bir listede sadece birkaç öğe olması gerektiğini söyleyebilirim, çünkü bir belgeye göre " maxValue rasgele sayının özel üst sınırıdır ".
Bir süredir bu ExtensionMethod kullanıyorum:
public static IEnumerable<T> GetRandom<T>(this IEnumerable<T> list, int count)
{
if (count <= 0)
yield break;
var r = new Random();
int limit = (count * 10);
foreach (var item in list.OrderBy(x => r.Next(0, limit)).Take(count))
yield return item;
}
Bir yerine daha sonra listenin içindeki öğelerin sırası çıkarma en önemli değilse ben, farklı bir yaklaşım önermek edeceğiz (ve her öğenin yalnızca bir kez seçilmesi gerekir) ListBir kullanabilirsiniz ConcurrentBagbir iş parçacığı güvenli, sırasız koleksiyon olan nesneleri:
var bag = new ConcurrentBag<string>();
bag.Add("Foo");
bag.Add("Boo");
bag.Add("Zoo");
EventHandler:
string result;
if (bag.TryTake(out result))
{
MessageBox.Show(result);
}
TryTakeSırasız koleksiyondan bir "rastgele" nesne ayıklamak için çalışacaktır.
Sadece bir tane yerine daha fazla eşyaya ihtiyacım vardı. Bu yüzden şunu yazdım:
public static TList GetSelectedRandom<TList>(this TList list, int count)
where TList : IList, new()
{
var r = new Random();
var rList = new TList();
while (count > 0 && list.Count > 0)
{
var n = r.Next(0, list.Count);
var e = list[n];
rList.Add(e);
list.RemoveAt(n);
count--;
}
return rList;
}
Bununla rastgele kaç tane istediğiniz gibi öğe elde edebilirsiniz:
var _allItems = new List<TModel>()
{
// ...
// ...
// ...
}
var randomItemList = _allItems.GetSelectedRandom(10);
JSON dosyasından rastgele ülke adı yazdırılıyor.
Model:
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);
Neden olmasın [2]:
public static T GetRandom<T>(this List<T> list)
{
return list[(int)(DateTime.Now.Ticks%list.Count)];
}