如何将数组转换为查找数据结构

时间:2018-03-31 14:47:41

标签: c# .net dictionary lookup

我有一个整数数组,如下所示:

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实现。

1 个答案:

答案 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

提供的输入。