随机播放字符串列表,但不要太多
Shuffle List of strings, but not too much
我在 C# 中有一个字符串列表,例如:
List<string> myList;
假设我通过添加 20 个字符串来填充它,从“1”开始到“20”。
myList.Add("1"); // And so on...
我怎样才能以最有效和优雅的方式随机打乱这个字符串列表,同时限制列表中的每个项目从其原始索引到 4 的距离。
我想要的例子:
我要订单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
例如洗牌为:
2 5 4 3 6 1 8 7 10 9 12 11 15 14 13 16 18 15 20 19
一种(直接的)方法是将列表分成四个部分,然后分别打乱这些部分。但我仍然不确定这样做的效率如何。
在我的案例中,效率意味着不做过于复杂或愚蠢的事情。
您可以使用以下代码:
List<int> myList = Enumerable.Range(1, 20).ToList(); // Feed the list from 1 to 20
int numberByGroups = 4;
List<int> result = new List<int>();
for (int skip = 0; skip < myList.Count; skip = skip + numberByGroups)
{
result.AddRange(myList.Skip(skip) // skip the already used numbers
.Take(numberByGroups) // create a group
.OrderBy(a => Guid.NewGuid()) // "Shuffle"
.ToList());
}
Console.WriteLine(String.Join(", ", result));
将按 numberByGroups
组随机播放
以下Linq
将创建一个新索引,其中新索引限制在与原始索引
相距distance
个地方
List<string> list = Enumerable.Range(1, 20).Select(i => i.ToString()).ToList();
Random rng = new Random();
int distance = 4;
List<string> newList = list
.Select((s, i) =>
new {OrigIndex = i, NewIndex = i + rng.Next(-distance, distance+1), Val = s})
.OrderBy(a => a.NewIndex).ThenBy(a=>a.OrigIndex)
.Select(a => a.Val)
.ToList();
我在 C# 中有一个字符串列表,例如:
List<string> myList;
假设我通过添加 20 个字符串来填充它,从“1”开始到“20”。
myList.Add("1"); // And so on...
我怎样才能以最有效和优雅的方式随机打乱这个字符串列表,同时限制列表中的每个项目从其原始索引到 4 的距离。
我想要的例子:
我要订单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
例如洗牌为:
2 5 4 3 6 1 8 7 10 9 12 11 15 14 13 16 18 15 20 19
一种(直接的)方法是将列表分成四个部分,然后分别打乱这些部分。但我仍然不确定这样做的效率如何。
在我的案例中,效率意味着不做过于复杂或愚蠢的事情。
您可以使用以下代码:
List<int> myList = Enumerable.Range(1, 20).ToList(); // Feed the list from 1 to 20
int numberByGroups = 4;
List<int> result = new List<int>();
for (int skip = 0; skip < myList.Count; skip = skip + numberByGroups)
{
result.AddRange(myList.Skip(skip) // skip the already used numbers
.Take(numberByGroups) // create a group
.OrderBy(a => Guid.NewGuid()) // "Shuffle"
.ToList());
}
Console.WriteLine(String.Join(", ", result));
将按 numberByGroups
以下Linq
将创建一个新索引,其中新索引限制在与原始索引
distance
个地方
List<string> list = Enumerable.Range(1, 20).Select(i => i.ToString()).ToList();
Random rng = new Random();
int distance = 4;
List<string> newList = list
.Select((s, i) =>
new {OrigIndex = i, NewIndex = i + rng.Next(-distance, distance+1), Val = s})
.OrderBy(a => a.NewIndex).ThenBy(a=>a.OrigIndex)
.Select(a => a.Val)
.ToList();