两个列表的交集与索引使用lambda表达式

时间:2016-09-01 07:18:37

标签: c# linq dictionary

我正在尝试创建一个包含两个序列的索引和匹配元素的字典。 例如: -

List<string> A = new List<string> { "a", "b", "c", "d", "e", "f", "g" };
List<string> B = new List<string> { "a", "d", "e", "f" };

现在我想构建一个看起来像这样的字典。

// Expected Output:-
// { "a" , 0 }
// { "d" , 3 }
// { "e" , 4 }
// { "f" , 5 }

其中字典中的第一个条目是两个列表中的公共元素,第二个条目是第一个列表中的公共元素(A)。 不确定如何使用Lambda Expression来表达这一点。

3 个答案:

答案 0 :(得分:3)

为此,B中的每个元素都使用IndexOf集合中的A。然后使用ToDictionary将其转换为您想要的字典表格

List<string> A = new List<string> { "a", "b", "c", "d", "e", "f", "g" };
List<string> B = new List<string> { "a", "d", "e", "f" };

 var result = B.Select(item => new { item, Position = A.IndexOf(item) })
               .ToDictionary(key => key.item, value => value.Position);

请注意,B中的项目必须是唯一的才能在KeyAlreadyExists上失败。在那种情况下:

 var result = B.Distinct()
               .Select(item => new { item, Position = A.IndexOf(item) })
               .ToDictionary(key => key.item, value => value.Position);

如果您不希望找到未找到的项目的结果:

 var result = B.Distinct()
               .Select(item => new { item, Position = A.IndexOf(item) })
               .Where(item => item.Position != -1
               .ToDictionary(key => key.item, value => value.Position);

答案 1 :(得分:0)

这应该这样做:

List<string> A = new List<string>{"a","b","c","d","e","f","g"};
List<string> B = new List<string>{"a","d","e","f"};
var result = B.ToDictionary(k => k, v => A.IndexOf(b)});

答案 2 :(得分:0)

试试这个:

List<string> A = new List<string> { "a", "b", "c", "d", "e", "f", "g" };
List<string> B = new List<string> { "a", "d", "e", "f" };

Dictionary<string, int> result = B.ToDictionary(x => x, x => A.IndexOf(x));