Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq - Fatal编程技术网

C# 如何用数组的最后一个索引替换数组的第二个和第三个索引?

C# 如何用数组的最后一个索引替换数组的第二个和第三个索引?,c#,linq,C#,Linq,事实上,我有一张这样的清单 oldList= ['First','Second','Third',.....'Seventh']; newArray应该是这样的 newArray=['First',.........'Seventh','Second','Third'] 那么,我怎样才能向linq c提供这样的订购 我的意思是我的第一个元素应该保留在老地方。但我必须将第二个和第三个元素跳到列表的末尾,但即使在这种情况下,您也可以使用OrderBy: var newArray = oldLis

事实上,我有一张这样的清单

oldList= ['First','Second','Third',.....'Seventh'];
newArray应该是这样的

newArray=['First',.........'Seventh','Second','Third']
那么,我怎样才能向linq c提供这样的订购


我的意思是我的第一个元素应该保留在老地方。但我必须将第二个和第三个元素跳到列表的末尾,但即使在这种情况下,您也可以使用OrderBy:

var newArray = oldList.Select((t, index) => new { t, index })
                      .OrderBy(x => x.index == 1 || x.index == 2)
                      .ThenBy(x => x.index)
                      .Select(x => x.t)
                      .ToArray();
这里有一个演示:

是的,您可以在LINQ中执行此操作,尽管它可能不是最有效的:

var newArray = oldList.Take(1)
    .Concat(oldList.Skip(3).Take(4))
    .Concat(oldList.Skip(1).Take(2))
    .ToArray();
但是,如果您的原始容器是一个列表,您可以更高效地执行以下操作:

var newList = oldList.GetRange(0, 1)
    .Concat(oldList.GetRange(3, 4))
    .Concat(oldList.GetRange(1, 2))
    .ToList();
更新:

对于踢腿和露齿而笑,我继续计时了几个建议的方法,看起来@L.B的Get/Add/RemoveRange位于顶部:

超过100000次迭代:

跳过/执行82毫秒0.00082毫秒/呼叫 GetRange/Concat每通话69毫秒0.00069毫秒 OrderBy/ThenBy每次通话145毫秒0.00145毫秒 添加/获取/删除时间为21毫秒0.00021毫秒/呼叫
当然,我们正在进行微优化,所以我要说的是,选择对您最有意义、最易于维护的微优化。但看起来L.B.的解决方案是最有效的,也很容易阅读。

如果你的收藏已经是一个列表,你可以跳过第一行

List<string> oldList2 = new List<string>(oldList);
var tmp = oldList2.GetRange(1, 2);
oldList2.RemoveRange(1, 2);
oldList2.AddRange(tmp);

LINQ设计用于查询数据源以产生新结果,而不是改变现有数据

我将使用的解决此问题的一般方法:

var second = array[1];
var third = array[2];

for(int i = 3; i < array.Length; i++)
{
    array[i-2] = array[i];
}

array[array.Length-2] = second;
array[array.Length-1] = third;

注意,这种方法迭代数据源3次;如果它实际上是一个数组或列表,这很好,但如果它实际上只是一个IEnumerable,这是一些查询或复杂操作的结果,这将是不好的。

你有固定长度的数组吗,Linq并不是为基于索引的操作而设计的。@Wug你怎么知道他想对数字进行排序而不是对它们的文本表示进行排序?有必要使用Linq吗?只是好奇为什么LINQ是你的要求。让我想起STL在C++中旋转FXN。我的意思是我的第一个元素应该保存在老地方。但我必须跳过第二和第三个元素到列表的末尾
var newArray = array.Take(1)
          .Concat(array.Skip(3))
          .Concat(array.Skip(1).Take(2))
          .ToArray();