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の直後(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 の指定されたインデックスに要素を挿入します。

クイック ノート- 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);
   }
}

op の必要に応じて、欠落している要素が 1 つだけ

   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);
     }
}

opの必要に応じて1つの要素のみ

     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 に答える