我有一个类似如下的列表:
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};
var ResultList = List1.Select(x => List2.IndexOf(x));
这是一种更长的解决方案,但可以避免对数组进行嵌套循环,如果数组很大,则可能更快(但如果数组很小则可能更慢)。
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();
您还可以使用重载版本的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();
List2
包含多个 List1 值(或相等值)类型的实例,则可以使用 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 值元组
List2.Select((x, idx) => (X:x, Idx:idx))
.Where(t => List1.Contains(t.X))
.Select(x => x.Idx);
(.IndexOf
只返回在目标中找到的第一个索引)
List1
中搜索项在List2
中的基于0的索引。 - StuartLCList2
中是否可以有多个与List1
中的值相同的实例?如果是这样,您是否想列出所有这些实例? - StuartLC