重新排列数组的顺序,在C#末尾放置null
本文关键字:null 顺序 新排列 排列 数组 | 更新日期: 2023-09-27 18:30:01
我正在尝试制作一个LRU,并跟踪价值顺序。
假设我有阵列items = "P1", "P3", null, null
- P4出现(项目=
"P1", "P3", "P4", null
) - P4还不存在,所以我只是将它添加到最低的
null
索引中 - 但随后P1再次出现,因此P1的位置转到
null
(项目=null, "P3", "P4", null
) - 然后我需要一种方法(我的问题)来改变一切(items=
"P3", "P4", null, null
) - 然后在最低
null
索引处添加P1(items="P3", "P4", "P1", null
) - 等等,跟踪LRU
因此,我需要找到一种方法,将所有非null移动到数组前面(按顺序)。
我确实找到了一篇使用这个items = items.Where(s => !String.IsNullOrEmpty(s)).ToArray();
的帖子,但当我想保持数组大小不变时,它会删除所有null
。
如何保持数组大小,同时将所有null移到末尾,将所有非null移到前面(保持值的顺序不变)
只是字面意思"首先是非空项目,然后是空项目":
var nulls = items.Where(x => x == null);
var nonnulls = items.Where(x => x != null);
var result = nonnulls.Concat(nulls);
或者:
var result = items.OrderBy(x => x == null).ThenBy(x => x.SomeOtherKey);
这里有一个不创建新数组的解决方案。它只是重新排列现有的数组。
static void MoveFront<T>(T[] arr) where T : class
{
int ileft = 0;
int iright = 1;
while (iright < arr.Length)
{
T left = arr[ileft];
T right = arr[iright];
if (left == null && right != null)
{
Swap(arr, ileft++, iright++);
}
else if (left == null && right == null)
{
iright++;
}
else if (left != null && right != null)
{
ileft += 2;
iright += 2;
}
else if (left != null && right == null)
{
ileft++;
iright++;
}
}
}
static void Swap<T>(T[] arr, int left, int right)
{
T temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
这样称呼它:
string[] arr = { "a", null, "b", null, "c" };
MoveFront(arr);