2012-04-10 67 views
0

如何在列表中間插入一些數字(如果沒有這樣的數字)?將元素插入到列表中,如果條件符合C#

在下面的例子中,我試圖插入數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); 
     } 

由於結果數量將在列表的末尾進入,但我想它後右三(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:反正我已經切換到二分查找方法,由於多種因素。大家感謝您的幫助!

+0

您接受錯誤的解決方法檢查@EsotericScreenName評論答案之後.....它爲您提供了ANS錯誤.... – 2012-04-10 18:52:57

+0

@PranayRana看到編輯..感謝注意到 – Alex 2012-04-10 18:55:58

+0

只是要注意接受的答案仍然不回答你需要它的只是搜索和插入它不循環每個缺少的元素.................所以你需要根據那個修改你的代碼..... – 2012-04-10 19:01:48

回答

4

你可以這樣做這個:

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

這樣,您將保持與可能的最佳性能排序列表。

+1

+1 BinarySearch – 2012-04-10 18:38:27

+0

儘管以前的方法對我來說工作得很好,但我必須承認你的解決方案很快且很簡單..絕對是最好的答案 – Alex 2012-04-10 19:00:17

+0

-1 - 只是爲了說明答案仍然沒有回答OP需要它的只是搜索和插入它的不爲每個缺失的元素循環.................所以你需要根據那個修改你的代碼.....對於像{0,2,6,9 ,10}並且需要插入1,3,4,5那 – 2012-04-10 19:04:32

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

只是作爲OP一個缺少的元素需要

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

列表'(0,2,6,9,10,...)'? – 2012-04-10 18:31:47

+0

它不會@LB例如工作肯定 – sarwar026 2012-04-10 18:33:13

+0

不正確的解決方案 – Casperah 2012-04-10 18:45:12

1

您正在尋找

list1.Insert(index, must_enter); 

要以特定的指數,而不是在列表的末尾插入一個元素。

您必須首先找到要插入的索引,這很容易通過二分查找來完成。從列表中間的值開始,並將其與您要插入的數字進行比較。如果更大,則搜索列表的下半部分,如果更多,則搜索列表的上半部分。重複這個過程,每次將列表分成兩半,直到找到前一個項目小於所插入項目的位置,而後一個項目大於您插入的位置。 (編輯:當然,如果你列表始終是非常小的,它可能少些麻煩只是通過從一開始就對列表進行迭代,找到正確的位置!)

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,落實好。

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到那個位置

+0

我認爲它有一個嚴重的性能問題。遍歷整個集合兩次以添加一個整數。 O(2 * n) – Casperah 2012-04-10 18:44:16

+1

-1:在你的例子中,如果'must_enter'> 6,你的代碼會拋出一個異常,因爲'FindIndex'返回-1。 – 2012-04-10 18:45:22

+0

@EsotericScreenName:謝謝。我已更新我的代碼。希望它現在能夠完美工作。 – sarwar026 2012-04-10 18:52:19

2

你可以這樣做:

list1.Add(must_enter); 

然後對列表進行排序:

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

結果將是:

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

編輯:

或者使用extesion方法:

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); 
+1

我不認爲OP的'項目的具體細節'會允許這個:) – 2012-04-10 18:35:00

+0

哦,對不起,我會編輯答案。謝謝。 – 2012-04-10 18:36:49

+0

我認爲list1.Sort()會更快地完成工作,但它仍然會缺乏性能。 – Casperah 2012-04-10 18:52:18

-1
if (!list1.Contains(must_enter)) 
{ 
    SortedSet<int> sorted = new SortedSet<int>(list1); 
    sorted.Add(must_enter); 
    list1 = sorted.ToList(); 
} 
+0

循環遍歷整個集合,再次對其進行排序並添加新值,然後將其轉換回列表。我不認爲這是完成這項簡單任務的最佳方式。 – Casperah 2012-04-10 18:48:58

+1

@Casperah。我很好奇,所以我將我的解決方案與您的解決方案進行了基準比較。事實證明,您的解決方案快200%左右。 – 2012-04-10 19:38:32

+0

太好了,我喜歡你實際測試過的事實,我會通過撤消我的downvote來回避你。 – Casperah 2012-04-12 19:53:25