在 LINQ 中对列表进行排序
本文关键字:排序 列表 LINQ | 更新日期: 2023-09-27 18:34:44
我必须创建一个包含对象的列表。并且对象需要按随机顺序排列。在这里,我给他们随机数:
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 似乎没有被排序...或者似乎没有得到随机数。我不知道是哪个。谁能看到我做错了什么??
尝试
RepeaterSponsorGold.DataSource = listGold.OrderBy(n => n.nummer).ToList();
如果您需要按随机顺序排序,您可以尝试:
var listGold = list1.OrderBy(n => Guid.NewGuid());
无需使用Random
.
你不应该使用 Random(( 来洗牌列表,因为它可以产生确定性分布。
相反,请使用 suffle:
随机化列表
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();
这个怎么样:
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));
你有几个问题。
最重要的是,你应该只有一个 Random 实例,并重复使用它,而不是每次都调用一个新的实例。
其次,通过使用列表计数作为种子,您将获得一个大致顺序的列表。
list1[i].nummer = tal.Next(list1.Count);
因为您正在使用您的列表。算作你的种子,你会得到一个列表,大致按照它们的添加顺序排列。
相反,请尝试:
Enumerable.Range(0,100)
.ToDictionary(k=> Guid.NewGuid())
.OrderBy(o => o.Key).Select(s => s.Value).ToList()
使用 Guid 将为您提供比随机更自然的随机化。