Yanıtlar:
Bir Random
yerde 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 static
yerde bir alanınız olabilir (iş parçacığı güvenliği sorunlarına dikkat edin):
static Random rnd = new Random();
Örnekte, Random
aş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)];
Random
Bunun 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 Random
nesneyi 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 .
IList
bö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());
maxValue
Yöntemin parametresinin Next
eksi 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) List
Bir kullanabilirsiniz ConcurrentBag
bir 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);
}
TryTake
Sı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)];
}