2013-12-12 4 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

просто предложение: использовать 'List песни1 = новый список () {8, 2, 5, 1, 1}; 'и' List list2 = new Список () {3, 4, 1, 7, 4}; 'для инициализации ваших списков –

+0

Вы неправильно поняли использование' Take'. Выражение '.Take (3)' дает вам обертку, которая будет давать ** top-3 ** элементы списка, когда вы перечисляете ('foreach') через него. Он не изменяет (удаляет) базовый список. –

ответ

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

oh ok Спасибо, что если бы у меня было 4 списка и просто нужно было переключать элементы списка из списка1 и list2, то переключайтесь между списками3 и списком4. Это все равно будет то же самое? –

+0

@CalvinJones Да, та же идея. Если вы хотите сделать какой-то поворот, т. Е. List1 -> list2 -> list3 -> list4, это будет 'var tmp = list1 [i]; list1 [i] = list2 [i]; list2 [i] = list4 [i]; list4 [i] = tmp; 'Но в этот момент вам может понадобиться составить список списков, чтобы упростить еще больше. Я думаю, вы понимаете логику. –

+0

@ p.s.w.g +1 для решения Linq. Впрочем, это слишком сложно. – 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); 
Смежные вопросы