在C#中对列表/数组进行碎片整理——关闭所有空白

目录

介绍

使用代码

1.列表示例的碎片整理

2.数组示例的碎片整理

更多功能


介绍

1、此方法有助于替换列表的空元素或默认元素。元素的空引用或默认引用将在列表中替换。

public static bool Defragment(IList<T> list, Func<T, bool> isEmptyOrDefaultElement)
       {
           if (list == null || isEmptyOrDefaultElement == null)
           {
               throw new Exception("Check the parameters they can not be null.");
           }

           bool result = false;
           int maxCount = list.Count - 1;

           for (int i = maxCount; i >= 0; i--)
           {
               if (isEmptyOrDefaultElement(list[i]))
               {
                   continue;
               }
               else
               {
                   for (int j = 0; j < i; j++)
                   {
                       if (!isEmptyOrDefaultElement(list[j]))
                       {
                           continue;
                       }
                       else
                       {
                           var value = list[j];
                           list[j] = list[i];
                           list[i] = value;
                           result = true;
                           break;
                       }
                   }
               }
           }

           return result;
       }

2、此方法有助于替换数组的空元素或默认元素。元素的空引用或默认引用将在数组中替换。

public static bool Defragment(T[] array, Func<T, bool> isEmptyOrDefaultElement)
      {
          if (array == null || isEmptyOrDefaultElement == null)
          {
              throw new Exception("Check the parameters they can not be null.");
          }

          bool result = false;
          int maxCount = array.Length - 1;

          for (int i = maxCount; i >= 0; i--)
          {
              if (isEmptyOrDefaultElement(array[i]))
              {
                  continue;
              }
              else
              {
                  for (int j = 0; j < i; j++)
                  {
                      if (!isEmptyOrDefaultElement(array[j]))
                      {
                          continue;
                      }
                      else
                      {
                          var value = array[j];
                          array[j] = array[i];
                          array[i] = value;
                          result = true;
                          break;
                      }
                  }
              }
          }

          return result;
      }

使用代码

1.列表示例的碎片整理

[TestMethod]
      public void ListWithPrimitiveDataTypesCase1_TheListIsDefragmented()
      {
          // prepare
          IList<int> list = new List<int>() { 0, 0, 0, 1, 0, 0, 1, 1 };

          // act
          Defragmentation<int>.Defragment(list, (x) => x == 0);

          // assert
          Assert.AreEqual(1, list[0]);
          Assert.AreEqual(1, list[1]);
          Assert.AreEqual(1, list[2]);
          Assert.AreEqual(0, list[3]);
          Assert.AreEqual(0, list[4]);
          Assert.AreEqual(0, list[5]);
          Assert.AreEqual(0, list[6]);
          Assert.AreEqual(0, list[7]);
      }

2.数组示例的碎片整理

[TestMethod]
      public void ArrayWithPrimitiveDataTypesCase1_TheArrayIsDefragmented()
      {
          // prepare
          int[] array = { 0, 0, 0, 1, 0, 0, 1, 1 };

          // act
          Defragmentation<int>.Defragment(array, (x) => x == 0);

          // assert
          Assert.AreEqual(1, array[0]);
          Assert.AreEqual(1, array[1]);
          Assert.AreEqual(1, array[2]);
          Assert.AreEqual(0, array[3]);
          Assert.AreEqual(0, array[4]);
          Assert.AreEqual(0, array[5]);
          Assert.AreEqual(0, array[6]);
          Assert.AreEqual(0, array[7]);
      }

更多功能

替换元素时,可以将值从数组/列表的非空元素复制到空元素。有关更多功能,请下载本文准备的文件和测试并进行研究。该项目包括其他两种方法:

1、对于列表:

public static bool Defragment(T[] array, Func<t, bool> isEmptyOrDefaultElement,
                                         Action<T, T> copyFromSourceToDestination)

2、对于数组:

public static bool Defragment(IList<T> list, Func<T, bool> isEmptyOrDefaultElement,
                              Action<T, T> copyFromSourceToDestination)

https://www.codeproject.com/Tips/5287288/Defragmentation-of-List-Array-in-Csharp-Closing-Al

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值