我有一个对象数组
MyObjects[] mos = GetMyObjectsArray();
现在我想将一个id为1085的元素移到第一个,所以我在LINQ中编写这样的代码,有更优雅的方法吗?
mos.Where(c => c.ID == 1085).Take(1).Concat(mos.Where(c => c.ID != 1085)).ToArray();
注意,我想保存其他项目的定位,因此与第一项交换不是解决方案
答案 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);