Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 洗牌字符串列表,但不要太多_C#_List_Shuffle - Fatal编程技术网

C# 洗牌字符串列表,但不要太多

C# 洗牌字符串列表,但不要太多,c#,list,shuffle,C#,List,Shuffle,我有一个C语言字符串列表,例如: List<string> myList; 我怎样才能以最高效、最优雅的方式随机地洗牌这个字符串列表,同时将列表中的每一项从其原始索引结束的距离限制在(比如)4 我想要的示例: 我要订单: 1234567891011213151617181920 例如,要随机移动到以下位置: 2 5 4 3 6 1 8 7 10 9 12 11 15 14 16 15 20 19 一种简单的方法是将列表分成四个部分,然后分别洗牌。但我仍然不确定这会有多大的效率 在我

我有一个C语言字符串列表,例如:

List<string> myList;
我怎样才能以最高效、最优雅的方式随机地洗牌这个字符串列表,同时将列表中的每一项从其原始索引结束的距离限制在(比如)4

我想要的示例:

我要订单:

1234567891011213151617181920

例如,要随机移动到以下位置:

2 5 4 3 6 1 8 7 10 9 12 11 15 14 16 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));
下面的Linq将创建一个新索引,其中新索引仅限于与原始索引的距离

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();  

你自己试过什么吗?你为什么要这么做?目的是什么?你的直截了当的方法比你的规范更具限制性。您的规范允许您的示例从2 5 4 3 6开始。。。但你直截了当的方式无法实现它。那么你想要的是什么呢?你可能想在@KrisVandermotten上问这个问题,当你提到其他网站时,说声谢谢通常是很有帮助的。这正是我想要的。
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();