2

如果没有这样的数字,如何在列表中间插入一些数字?

在下面的示例中,我尝试插入数字 4

        List<int> list1 = new List<int>(){ 0, 1, 2, 3, 5, 6 };
        int must_enter = 4;
        if (!list1.Contains(must_enter))
        {
            list1.Add(must_enter);
        }

因为结果编号将在列表末尾输入,但我希望它在 3 (before 5) 之后

请注意,由于项目的具体情况,我不能使用排序列表,但列表中的所有数字都保证按升序排列(0、2、6、9、10,...)

编辑:我知道一个错误,这就是我所做的:

        List<int> list0 = new List<int>() { 1, 2, 3, 5, 6 };
        int must_enter = 7;
        if (!list0.Contains(must_enter))
        {
            if (must_enter < list0.Max())
            {
                int result = list0.FindIndex(item => item > must_enter || must_enter > list0.Max());
                list0.Insert(result, must_enter);
            }
            else
            {
                list0.Add(must_enter);
            }

        }

edit2:无论如何,由于几个因素,我已经切换到 BinarySearch 方法。大家感谢您的帮助!

4

7 回答 7

5

你可以这样做:

int index = list1.BinarySearch(must_enter);
if (index < 0)
 list1.Insert(~index, must_enter);

这样,您将保持列表以最佳性能排序。

于 2012-04-10T18:35:34.697 回答
2

你可以做:

list1.Add(must_enter);

然后排序列表:

list1 = list1.OrderBy(n => n).ToList();

结果将是:

0, 1, 2, 3, 4, 5, 6 

编辑:

或使用扩展方法:

static class Utility
{
     public static void InsertElement(this List<int> list, int n)
     {
         if(!list.Contains(n))
         {     
             for(int i = 0; i < list.Count; i++)
             {
                  if(list[i] > n)
                  {
                     list.Insert(i-1, n);
                     break;
                  }

                  if(i == list.Count - 1)
                     list.Add(n);
             }
         }
     }
}

进而:

list1.InsertElement(must_enter);
于 2012-04-10T18:33:23.823 回答
1

你正在寻找

list1.Insert(index, must_enter);

在特定索引处插入元素,而不是在列表末尾。

您必须首先找到要插入的索引,这可以通过二分搜索轻松完成。从列表中间的值开始,并将其与要插入的数字进行比较。如果更大,则搜索列表的下半部分,如果更大,则搜索列表的上半部分。重复该过程,每次将列表分成两半,直到找到之前的项目小于您插入的项目并且之后的项目大于您插入的项目的位置。(编辑:当然,如果您的列表总是很小,那么从头开始遍历列表以找到正确的位置可能会更轻松!)

于 2012-04-10T18:27:49.053 回答
0
list1.Insert(4, 4)

List<T>.Insert Method- 在指定索引处将元素插入到列表中。

快速说明- List 类型的 Insert 实例方法在许多情况下性能不佳。因为对于插入,列表必须调整以下元素。

这是我得到这个答案的原始帖子尝试一下可能会对您有所帮助:Finding best position for element in list

List<int> list = new List<int>{0,2,6,9,10};
for (int i = 0; i < list1.Count; i++)
{
   int index = list.BinarySearch(i);
   if( i < 0)
   {
    int insertIndex = ~index; 
    list.Insert(insertIndex, i);
   }
}

仅针对操作需要的一个缺失元素

   int index = list.BinarySearch(4);
   if( index < 0)
   {
    int insertIndex = ~index; 
    list.Insert(insertIndex, 4);
   }

或者

List<int> list1 = new List<int>() { 0,2,6,9,10 };
int must_enter = 4;

for (int i = 0; i < list1.Count; i++)
{
     if (!list1.Contains(i))
     {
         list1.Insert(i , i);
     }
}

仅针对操作需要的一个元素

     if (!list1.Contains(4))
     {
         list1.Insert(4 , 4);
     }
于 2012-04-10T18:27:46.607 回答
0
List<int> list1 = new List<int>() { 0, 1, 2, 3, 5, 6 };
int must_enter = 4;

for (int i = 0; i < list1.Count; i++)
{
     if (must_enter >= list1[i])
     {
         list1.Insert(i + 1, must_enter);
     }
}

编辑:我喜欢 sarwar026,实现更好。

于 2012-04-10T18:30:39.490 回答
0
    List<int> list1 = new List<int>(){ 0, 1, 2, 3, 5, 6 };
    int must_enter = 4;
    if (!list1.Contains(must_enter))
    {
        int result = list.FindIndex(item => item > must_enter);
        if(result!=-1)
            list1.Insert(result, must_enter);
        else  // must_enter is not found
        {
            if(must_enter > list.Max()) // must_enter > max value of list
                list1.Add(must_enter);
            else if(must_enter < list.Min())  // must_enter < min value of list
                list1.Insert(0, must_enter);
        }
    }

首先,找到大于must_enter (4) 的数字的索引,然后将must_enter插入该位置

于 2012-04-10T18:31:03.727 回答
-1
if (!list1.Contains(must_enter))
{
    SortedSet<int> sorted = new SortedSet<int>( list1 );
    sorted.Add( must_enter );
    list1 = sorted.ToList();
}
于 2012-04-10T18:35:51.320 回答