重新排列数组的顺序,在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移到前面(保持值的顺序不变)

重新排列数组的顺序,在C#末尾放置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);