C#从列表中返回int并创建一个元组列表,其中每个int以及每个int在第一个列表中具有的索引

时间:2019-01-04 01:48:47

标签: c# list indexing return

我有一个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?          
*/

2 个答案:

答案 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));
    }