1

我必须制作一个包含对象的列表。并且对象需要以随机顺序排列。在这里,我给他们随机数:

Random tal = new Random();
list1[i].nummer = tal.Next(list1.Count);
listGold.Add(list1[i]);

现在我只需要按编号订购它们。我认为 linq 可以为我做。但它不能:S

我正在尝试这个:

RepeaterSponsorGold.DataSource = listGold.OrderBy(n => n.nummer);
RepeaterSponsorGold.DataBind();

按数字排序我的列表并将列表放入我的repater。但是 lsit 似乎没有排序......或者似乎没有得到随机数。我不知道是哪个。谁能看到我做错了什么?

4

5 回答 5

3

尝试

RepeaterSponsorGold.DataSource = listGold.OrderBy(n => n.nummer).ToList();
于 2012-05-21T13:33:53.757 回答
2

您不应该使用 Random() 来打乱列表,因为它会产生确定性分布。

相反,使用 suffle:

随机化一个列表<T>

public static void Shuffle<T>(this IList<T> list)  
{  
    Random rng = new Random();  
    int n = list.Count;  
    while (n > 1) {  
        n--;  
        int k = rng.Next(n + 1);  
        T value = list[k];  
        list[k] = list[n];  
        list[n] = value;  
    }  
}

....

listGold.Shuffle();
于 2012-05-21T13:38:07.417 回答
2

如果您需要按随机顺序排序,您可以尝试:

var listGold = list1.OrderBy(n => Guid.NewGuid());

无需使用Random

于 2012-05-21T13:36:01.150 回答
0

这个怎么样:

List<string> list = new List<string>()
                        {
                            "Blue",
                            "Brown",
                            "Beige",
                            "Red",
                            "Black"
                        };
Random random = new Random();
var orderedList = list.Select(c => new {Item = c, Order = random.Next()})
    .OrderBy(i=>i.Item)
    .Select(x=>x.Item).ToList();

orderedList.ForEach(x=>Console.WriteLine(x));
于 2012-05-21T13:38:51.937 回答
0

你有几个问题。

最重要的是,您应该只拥有一个 Random 实例,并重复使用它,而不是每次都调用一个新实例。

其次,通过使用列表计数作为种子,您将获得一个大致顺序的列表。

list1[i].nummer = tal.Next(list1.Count);

因为您正在使用您的 list.Count 作为您的种子,所以您将获得一个大致按添加顺序排列的列表。

而是尝试:

Enumerable.Range(0,100)
    .ToDictionary(k=> Guid.NewGuid())
    .OrderBy(o => o.Key).Select(s => s.Value).ToList()

使用 Guids 会给你一个比 Random 更自然的随机化。

于 2012-05-21T13:41:40.360 回答