[英]How to get random value from property from one List?
我有一個10,000個Element
類型的條目的列表:
public class Element
{
public Element()
{
this.Id = Guid.NewGuid();
}
public Guid Id { get; set };
}
我還有另一個Link
類型為5,000的條目的列表:
public class Link
{
public Link(Guid ElementOne, Guid ElementTwo)
{
this.ElementOne = ElementOne;
this.ElementTwo = ElementTwo;
}
public Guid ElementOne { get; set; }
public Guid ElementTwo { get; set; }
}
我在這里填充列表:
for (int i = 0; i < 10,000; i++)
this.ListOfElements.Add(new Element());
for (int i = 0; i < 5,000; i++)
{
this.ListOfLinks.Add(new Link(need ElementOne, need ElementTwo));
}
我不確定ElementOne
和ElementTwo
要通過什么。 我想從元素列表( Element.Id
)中獲取兩個參數的隨機ID,並確保它們是唯一的( ElementOne
永遠不會是ElementTwo
)。
聽起來您只需要兩個隨機數。 如果碰巧有重復,可以進行比較和查詢。
for (int i = 0; i < 5,000; i++)
{
int ele1 = Random.NextInt(10000);
int ele2 = Random.NextInt(10000);
while(ele1 == ele2){
ele2 = Random.NextInt(10000);
}
this.ListOfLinks.Add(new Link(ListOfElements[ele1], ListOfElements[ele2]));
}
下面的代碼將給您的列表一個隨機的索引數組。 因此,您可以采用randIndex [0]和randIndex [1]來獲得兩個隨機項。
Random rand = new Random();
List<string> myList = new List<string>() { "a","b","c"};
int[] randIndex = myList.Select((x,i) => new {i = i, rand = rand.Next()}).OrderBy(x => x.rand).Select(x => x.i).ToArray();
您需要找到未使用的下一個元素,也可以使用.OrderBy(i => Guid.NewGuid())
獲得隨機元素
private Element GetNextAvaibaleElement() {
var usedElementIds = listOfLinks.Select(i => i.ElementOne).Union(listOfLinks.Select(i => i.ElementTwo));
return listOfElements.Where(i => !usedElementIds.Contains(i.Id)).OrderBy(i => Guid.NewGuid()).FirstOrDefault();
}
然后得到兩個可用的元素
for (int i = 0; i < 5,000; i++)
{
this.ListOfLinks.Add(new Link(GetNextAvaibaleElement().Id,GetNextAvaibaleElement().Id));
}
在這里看到這個dotnet小提琴
在某處創建Random
類的實例。
例如
static Random rdm = new Random();
然后,使用該rdm
實例生成一個隨機整數,從列表中刪除該元素(以免重復使用),並繼續進行直到您耗盡列表。
List<Element> listOfElements; // list of 10k Elements
for (int i = 0; i < 5,000; i++)
{
int r = rdm.Next(listOfElements.Count);
Element elementOne = listOfElements[r];
listOfElements.RemoveAt(r);
r = rdm.Next(listOfElements.Count);
Element elementTwo = listOfElements[r];
this.ListOfLinks.Add(new Link(elementOne, elementTwo));
}
解決此問題的一種方法是創建一個整數列表,該整數列表表示ListOfElements
的索引,然后以隨機方式對該列表進行排序。 然后,您可以按索引簡單地引用ListOfElements
的項目,依次瀏覽隨機索引列表:
private static void Main()
{
for (int i = 0; i < 10000; i++) ListOfElements.Add(new Element());
// Create a randomly-ordered list of indexes to choose from
var rnd = new Random();
var randomIndexes = Enumerable.Range(0, ListOfElements.Count)
.OrderBy(i => rnd.NextDouble()).ToList();
// Now use our random indexes to pull unique items from the Element list
for (int i = 0; i < 10000; i += 2)
ListOfLinks.Add(new Link(ListOfElements[randomIndexes[i]].Id,
ListOfElements[randomIndexes[i + 1]].Id));
GetKeyFromUser("\nDone! Press any key to exit...");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.