-1

其实我有一个像

oldList= ['First','Second','Third',.....'Seventh'];

newArray 应该是这样的

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

那么如何使用 linq c# 提供这样的排序?

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

4

4 回答 4

1

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

List<string> oldList2 = new List<string>(oldList);
var tmp = oldList2.GetRange(1, 2);
oldList2.RemoveRange(1, 2);
oldList2.AddRange(tmp);
于 2012-10-16T14:21:20.080 回答
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

于 2012-10-16T14:15:44.703 回答
1

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

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

但是,如果您的原始容器是 a List<T>,您可以更有效地做一些事情:

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

更新

对于踢腿和笑容,我继续为几种建议的方法计时,看起来@LB'sGet/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 毫秒/调用)

当然,我们在这里进行微优化,所以我会说选择对您最有意义且最可维护的那个。但看起来 LB 的解决方案是性能最高的(并且也易于阅读)。

于 2012-10-16T14:16:55.933 回答
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>一些查询或复杂操作的结果,那将是不好的。

于 2012-10-16T14:31:53.287 回答