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

时间:2012-10-16 14:06:49

标签: c# linq

其实我有一个像

这样的清单
oldList= ['First','Second','Third',.....'Seventh'];

newArray应该是那样的

newArray=['First',.........'Seventh','Second','Third']

那么如何使用linq c#提供这样的订购?

我的意思是我的第一个元素应保存在旧地方。但我必须跳过第二和第三个元素到列表的末尾

4 个答案:

答案 0 :(得分:1)

奇怪的要求,但即使在这种情况下你也可以使用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();

以下是演示:http://ideone.com/qJOlv

答案 1 :(得分:1)

是的,您可以在LINQ中执行此操作,但它可能效率最高:

var newArray = oldList.Take(1)
    .Concat(oldList.Skip(3).Take(4))
    .Concat(oldList.Skip(1).Take(2))
    .ToArray();

但是,如果您的原始容器是List<T>,则可以更有效地执行操作:

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

<强>更新

对于踢腿和笑话,我继续前进并计划了一些提议的方法,看起来@L.B的Get/Add/RemoveRange()位于顶部:

超过100,000次迭代:

  • Skip()/ Take()花了82毫秒(0.00082毫秒/通话)
  • GetRange()/ Concat()耗时69毫秒(0.00069毫秒/通话)
  • OrderBy()/ ThenBy()花了145毫秒(0.00145毫秒/通话)
  • Add / Get / RemoveRange()花了21毫秒(0.00021毫秒/通话)

当然,我们在这里进行微观优化,所以我会说最适合你的那个,并且是最易于维护的。但看起来L.B的解决方案性能最高(并且易于阅读)。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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;

如果你真的需要使用LINQ,我会做这样的事情:

var newArray = array.Take(1)
          .Concat(array.Skip(3))
          .Concat(array.Skip(1).Take(2))
          .ToArray();

请注意,此方法迭代数据源3次;如果它实际上是一个数组或列表,那就没关系了,但实际上,如果它只是一个IEnumerable<T>,那么某些查询或复杂操作的结果就会很糟糕。