我有一个整数数组,如下所示:
2 2 4 3
我想为上述数据创建Lookup。我希望对于数组中存在的每个唯一编号,我可以将索引维护为链表,以防重复:
2 - 0,1
4 - 2
3 - 3
我通过LINQ尝试了一些东西,这似乎是获取Lookup类实例的标准方法,但这不是编译:
var prices = new int[] { 2,2,4,3};
var lookUp = prices.ToLookup<int,int>((x, i) => i + 1);
我不明白为什么我不能简单地实例化Lookup
类并像在Dictionary
类中那样添加项目。每当它发现再次添加相同的密钥时,它应该只是创建一个集合。我推测可以使用的示例代码:
var prices = new int[] { 2,2,4,3};
var lookUp = new Lookup<int,int>();
for (int i = 0; i < prices.Length; i++)
lookUp.Add(prices[i], i);
这再次没有编译为a note on MSDN说:
没有公共构造函数来创建a的新实例 抬头。另外,查找对象 是不可变的,也就是说,你不能添加或删除元素或键 创建后的Lookup对象。
有人可以帮我实现我的主要目标吗?我正在努力解决如何在C#中实现Lookup
实现。
答案 0 :(得分:2)
创建查找的要点是首先将数组中的值映射到数组中的索引/位置,然后使用vlaue作为键从映射创建查找,并为查找项创建该值的索引
以下示例演示如何将数组转换为所需的查找
using System;
using System.Linq;
public class Program {
public static void Main() {
var prices = new int[] { 2, 2, 4, 3 };
var map = prices.Select((value, index) => new { index, value });
var lookUps = map.ToLookup(_ => _.value, _ => _.index);
foreach(var item in lookUps) {
var value = item.Key;
var indexes = string.Join(",", item);
var output = String.Format("{0} - {1}", value, indexes);
Console.WriteLine(output);
}
}
}
哪个输出
2 - 0,1
4 - 2
3 - 3
提供的输入。