将项目移动到数组中的第一个

时间:2011-01-18 08:27:24

标签: c# arrays linq

我有一个对象数组

MyObjects[] mos = GetMyObjectsArray();

现在我想将一个id为1085的元素移到第一个,所以我在LINQ中编写这样的代码,有更优雅的方法吗?

mos.Where(c => c.ID == 1085).Take(1).Concat(mos.Where(c => c.ID != 1085)).ToArray();

注意,我想保存其他项目的定位,因此与第一项交换不是解决方案

3 个答案:

答案 0 :(得分:5)

这不是LINQ,但它是我用数组做的。

public static bool MoveToFront<T>(this T[] mos, Predicate<T> match)
  {
    if (mos.Length == 0)
    {
      return false;
    }
    var idx = Array.FindIndex(mos, match);
    if (idx == -1)
    {
      return false;
    }
    var tmp = mos[idx];
    Array.Copy(mos, 0, mos, 1, idx);
    mos[0] = tmp;
    return true;
  }

用法:

MyObject[] mos = GetArray();
mos.MoveToFront(c => c.ID == 1085);

答案 1 :(得分:2)

// input array
T[] arr = Get();

// find the item
int index = Array.FindIndex(arr, i => i.ID == 1085);
if (index == -1)
    throw new InvalidOperationException();

// get the item
T item = arr[index];

// place the item to the first position
T[] result = new T[arr.Length];
result[0] = item;

// copy items before the index
if (index > 0)
    Array.Copy(arr, 0, result, 1, index);

// copy items after the index
if (index < arr.Length)
    Array.Copy(arr, index + 1, result, index + 1, arr.Length - index - 1);

return result;

答案 2 :(得分:1)

数组不是您正在尝试的操作的最佳数据结构,它可能需要复制大量项目。对于你正在做的事情你应该使用List。

首先,按如下方式定义List扩展方法:

static class ListExtensions
{
    public static bool MoveToFront<T>(this List<T> list, Predicate<T> match)
    {
        int idx = list.FindIndex(match);

        if (idx != -1)
        {
            if (idx != 0) // move only if not already in front
            {
                T value = list[idx]; // save matching value
                list.RemoveAt(idx); // remove it from original location
                list.Insert(0, value); // insert in front
            }
            return true;
        }

        return false; // matching value not found
    }
}

然后您可以使用MoveToFront扩展方法(从您的示例中修改):

List<int> mos = GetMyObjectsList();
mos.MoveToFront(i => i == 1085);