我有一个对象:
public class Object{
public String ID{get;set;}
}
我的软件收到一个列表:
List<Object> objs = new List<Object>();
objs.add(new Object{ID = "1"});
objs.add(new Object{ID = "2"});
objs.add(new Object{ID = "3"});
objs.add(new Object{ID = "4"});
然后我将其随机化:
objs = objs.OrderBy(a => Guid.NewGuid()).ToList();
Debug.WriteLine(objs.ID);
// 1 4 2 3
如果我执行objs.OrderBy(a => Guid.NewGuid()).ToList();
,我将收到另一个随机序列// 3 2 4 1
。
我需要传递一个“种子”(整数)并对该数字进行随机化,例如,如果我传递种子1
时收到// 3 2 4 1
,则当我再次执行数字1时我需要接收相同的订单// 3 2 4 1
。
有没有一种方法可以在c#中完成?
编辑:上面的对象只是一个例子,实际情况中我需要将以下对象随机化:
public class Object{
public Int ID{get;set;}
public String ImageTitle{get;set;}
public String ImageDescription{get;set;}
public String Url {get;set;}
}
答案 0 :(得分:2)
不是使用GUID
,而是使用Random
不仅可行而且容易:
var seed = 123;
var r = new Random(seed);
objs = objs.OrderBy(o => r.Next()).ToList();
答案 1 :(得分:0)
使用此方法并缓存随机数组,然后再次提供服务。简单。
private Dictionary<int, List<Object>> randoms=new Dictionary<int, List<Object>>();
private List<Object> GetRandom(List<Object> objs,int? seed)
{
if (seed == null)
{
return objs.OrderBy(a => Guid.NewGuid()).ToList();
}
else
{
if (!randoms.ContainsKey(seed.Value))
randoms[seed.Value] = objs.OrderBy(a => Guid.NewGuid()).ToList();
return randoms[seed.Value];
}
}
示例调用GetRandom(objs,null)将始终对其进行随机化。如果您使用数字GetRandom(objs,1)进行调用,那么他将提供旧的随机数组。