2013-12-12 117 views
0

你好,我一直在努力試圖通過其索引切換2整數列表中的元素。 我的第一個列表和第二個列表具有以下值。列表之間的交換元素

list1 = {8, 2, 5, 1, 1} 
list2 = {3, 4, 1, 7, 4} 

我想切換兩個列表中的前3個元素,並得到這樣的輸出。

list1 = {3, 4, 1, 1, 1} 
list2 = {8, 2, 5, 7, 4} 

這裏是我到目前爲止的代碼:

List<int> list1 = new List<int>(); 
      List<int> list2 = new List<int>(); 
      list1.Add(8); 
      list1.Add(2); 
      list1.Add(5); 
      list1.Add(1); 
      list1.Add(1); 
      list2.Add(3); 
      list2.Add(4); 
      list2.Add(1); 
      list2.Add(7); 
      list2.Add(4); 

      int index = 3; 
      var firstPairItems = list1.Take(index); 
      var secondPairItems = list2.Take(index); 
      list1.InsertRange(indexPairs,secondPairItems); 
      list2.InsertRange(indexPairs, firstPairItems); 

我覺得我在正確的軌道上,但不是在第一個3指數更換它,它的指數排序的增加值。立即輸出列表1-

list1 = {8, 2, 5, 3, 4, 1, 1, 1 } 

任何建議,以另一種可靠的方式來解決它。

+1

只是一個建議:用'名單列表1 =新名單(){8,2,5, 1,1};''和'List list2 = new List (){3,4,1,7,4};'初始化您的列表 –

+0

您誤解了Take的用法。說'.Take(3)'給你一個封裝器,當你枚舉('foreach')時,它將產生列表的前3個元素。它不會修改(從中刪除)基礎列表。 –

回答

3

列表允許你直接操作通過索引他們的內容,所以你可以交換的元素是這樣的:

for (int i = 0; i < 3; i++) 
{ 
    var tmp = list1[i]; 
    list1[i] = list2[i]; 
    list2[i] = tmp; 
} 

如果你需要一個解決方案,能夠爲任何IEnumerable<T>工作,不只是列出,那麼你可以使用LINQ的一點點,像這樣:

var newList1 = list2.Take(3).Concat(list1.Skip(3)); 
var newList2 = list1.Take(3).Concat(list2.Skip(3)); 
+0

好吧,謝謝如果我有4個列表,只想切換list1和list2中的列表元素,然後在list3和list4之間切換。它仍然是一樣的權利? –

+0

@CalvinJones是的,同樣的想法。如果你想做一種輪換,即list1 - > list2 - > list3 - > list4,它會是'var tmp = list1 [i]; list1 [i] = list2 [i]; list2 [i] = list4 [i]; list4 [i] = tmp;'但是在那時你可能想要列出一個列表來簡化事情。儘管我認爲你理解了邏輯。對於Linq解決方案, –

+0

@ p.s.w.g +1。但它是過度的。 – Leri

2

最簡單的解決方法就是交換的元素:

for (int i = 0; i < 3; i++) { 
    int tmp = list1[i]; 
    list1[i] = list2[i];; 
    list2[i] = tmp; 
} 

Demo

但是,還有一個解決方案不需要臨時變量。但是,恕我直言,這太過分了魔力:

for (int i = 0; i < 3; i++) { 
    list2[i] = list1[i]^list2[i]; 
    list1[i] = list2[i]^list1[i]; 
    list2[i] = list1[i]^list2[i]; 
} 

Demo

或者

for (int i = 0; i < 3; i++) { 
    list2[i] = list1[i] + list2[i]; 
    list1[i] = list2[i] - list1[i]; 
    list2[i] = list2[i] - list1[i]; 
} 

Demo

注:我已經硬編碼在回答3只是爲了保持短。在現實世界中,你想避免這個magic number,並根據你的需要使其成爲一個常量或變量。

1

很簡單

for (int i = 0; i < 3; i++) { 
    int newVariable= list1[i]; 
    list1[i] = list2[i];; 
    list2[i] = newVariable; 
} 
1

您可以使用的LINQ此:

List<int> list1 = new List<int>() { 8, 2, 5, 1, 1 }; 
List<int> list2 = new List<int>() { 3, 4, 1, 7, 4 }; 

list2.InsertRange(0, list1.Take(3)); 
list1.RemoveRange(0, 3); 

// 3 items have been inserted already, so we should skip them 
list1.InsertRange(0, list2.Skip(3).Take(3)); 
list2.RemoveRange(3, 3);