您好我一直在努力尝试通过索引来切换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 }
有关另一种可靠解决方法的建议。
答案 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;
}
但是,还有一个解决方案不需要临时变量。但是,恕我直言,这太神奇了:
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];
}
或者
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];
}
注意:我已将硬编码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);