在列表之间切换元素

时间:2013-12-12 06:50:36

标签: c#

您好我一直在努力尝试通过索引来切换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个索引处替换它,而是在索引处添加值。立即输出list1 -

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

有关另一种可靠解决方法的建议。

4 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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,并根据您的需要将其设置为常量或变量。

答案 2 :(得分:1)

非常简单

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

答案 3 :(得分: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);