2013-12-12 77 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);