我有一个int列表,并使用FindAll在列表中查找项目,然后在另一个列表中返回结果。由于第二个列表的元素较少,因此元素的索引可能与第一个列表的索引不同。因此,我希望有一个简单快速的系统来将FindAll的结果某种程度上链接到他们在第一个列表中拥有的索引。 我认为具有两个int的元组列表将是理想的,因为该元组的第一个int将是第二个列表的每个int,而该tuple的第二个int将是第二个列表中每个项具有的索引第一个清单。我希望元组是原始元组(不是ValueTuple)
List<int> list1 = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 };
List<int> list2 = new List<int>();
List<Tuple<int, int>> list2index = new List<Tuple<int, int>>();
list2 = list1.FindAll(x => x > 3 && x < 7); // Returns 4 5 6
/*
Now I want to create the list of tuples<int, int> so it should
return:
(4, 3)
(5, 4)
(6, 5)
The first int is the first item of the list2
and the second int is its index in the list1
How can I create this list of tuples in a fast way?
*/
答案 0 :(得分:1)
希望我能正确理解您的要求。
list2 = list1.FindAll(x => x > 3 && x < 7);
list2index = list1.Select((x,index)=> Tuple.Create(x,index)).ToList();
如果在创建列表2之后和创建列表2索引之前列表1发生了更改,您还可以执行以下操作
var list2Index = list2.Select(x=> Tuple.Create(x, list1.IndexOf(x)));
两种情况下的输出均为
(4, 3)
(5, 4)
(6, 5)
答案 1 :(得分:1)
我宁愿建议您使用for循环而不是linq来提高性能:
for (int i = 0; i < list1.Count; i++)
{
int x = list1[i];
if (x > 3 && x < 7)
list2index.Add(new Tuple<int, int>(x,i));
}