我有一个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};
答案 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();