C#Linq在另一个List <int>中查找List <int>中项目的所有索引

时间:2017-10-20 04:02:49

标签: c# list linq

我有一个List看起来像:

List<int> List1= new List<int>(){3,4,5};

另一个看起来像:

List<int> List2 = new List<int>(){1,2,3,4,5,6};

如何使用Linq从List2获取List1的所有索引的数组,如下所示:

var ResultList = {2,3,4};

4 个答案:

答案 0 :(得分:7)

var ResultList = List1.Select(x => List2.IndexOf(x));

答案 1 :(得分:1)

这是一个较长的解决方案,但是阻止了通过数组的嵌套循环,如果数组很大(如果数组很小,则可能会更慢)。

List<int> List1= new List<int>(){3,4,5};
List<int> List2 = new List<int>(){1,2,3,4,5,6};

var lookup = new Dictionary<int, int>();
for(var i=0; i<List2.Count; i++) {
    lookup[List2[i]] = i;
}

List<int> Result = List1.Select(i => {
    int index;
    return lookup.TryGetValue(i, out index) ? index : -1;
}).ToList();

答案 2 :(得分:0)

如果您的List2包含多个List1值(或Equality)类型的实例,那么您可以使用indexed overload of Select查找所有重复项:

var List1= new List<int>(){3,4,5};
var List2 = new List<int>(){1,2,3,4,5,6,1,2,3,5};   

var result = List2.Select((x, idx) => Tuple.Create(x, idx))
    .Where(t => List1.Contains(t.Item1))
    .Select(x => x.Item2)

// 2,3,4,8,9

或更好,使用C#7 Value Tuples

List2.Select((x, idx) => (X:x, Idx:idx))
        .Where(t => List1.Contains(t.X))
        .Select(x => x.Idx);

.IndexOf只返回目标中找到的第一个索引)

答案 3 :(得分:0)

您还可以执行Select语句的重载版本以选择值并返回索引:

var result = List2.Select((a, b) => new {Value = a, Index = b})
                          .Where(x => List1.Any(d => d == x.Value))
                          .Select(c => c.Index).ToArray();