基于键值对中的值从字典中提取键值对子集的好方法

时间:2016-06-19 14:53:27

标签: c# dictionary

我有一个在Dictionary中表示的表,其中每个键对应于列名,而(value)List包含该列的行的值。所以列表项的索引是我的行索引。

试图找出一个linq C#实现,它将为我提供列中值的索引,从而为其他键派生其相邻列值。例如,如果我的表格表示如下:

    Key1  AA   BB   JX   TR FT
    Key2  AX   BC   SF   XO ST
    Key3  22   22   22   21 21
    Key4  AW   BM   ND   NC PO
    Key5  AZ   BN   SD   DS ZX         

我想在Key3中找到最多出现的值,例如22,并为Key1和Key2的相邻值提取键值对的子集。我已经看到了如何获取重复索引的示例,并且我可以通过迭代来推导子集字典,但理想情况下我希望它是一个执行它的语句。

目前使用此论坛的示例中的标准:数字

    var result = Enumerable.Range(0, table["Key3"].Count)
                     .Where(i => table["Key3"][i] == number)
                     .ToList();

希望有人可以建议一种方法将子集字典的提取添加到此语句中。

1 个答案:

答案 0 :(得分:1)

首先,我不确定我很清楚你想要实现的目标......

其次,正如问题评论中提到的Marc Gravell一样,Dictionary对象没有定义的排序和索引,除非它是OrderedDictionary

第三,在你的情况下,最好的选择是使用for循环,因为这总是(*)比任何Linq解决方案更快。

* - 通常;)

我最好的猜测是:

Dictionary<string, List<string>> oDict = new Dictionary<string, List<string>>();

oDict.Add("Key1", new List<string>{"AA", "BB", "JX", "TR", "FT"});
oDict.Add("Key2", new List<string>{"AX", "BC", "SF", "XO", "ST"});
oDict.Add("Key3", new List<string>{"22", "22", "22", "21", "21"});
oDict.Add("Key4", new List<string>{"AW", "BM", "ND", "NC", "PO"});
oDict.Add("Key5", new List<string>{"AZ", "BN", "SD", "DS", "ZX"}); 
//key to find
string searchedKey = "Key3";
//value to find
string searchedValue = "22";
//get index of Key
var keyIndex = oDict.Keys.ToList().IndexOf(searchedKey);  //if not found, returns -1
//returns 2

//get the list of indexes where the value has been found
var valIndexes = Enumerable.Range(0, oDict[searchedKey].Count)
             .Where(i => oDict[searchedKey][i] == searchedValue)
             .ToList();
//returns: {0, 1, 2}

//get distination resultset
var resultSubset = oDict
                    .Take(keyIndex+1) //take the no. of Keys
                    .ToDictionary(a=>a.Key,
                            a=>a.Value.Where((x,z) => valIndexes
                                                    .Any(i=> i==z)) 
                                                    .Select(x=>x).ToList());

以上代码返回:Dictionary<<string>, List<string>>()

Key1, {AA, BB, JX} 
Key2, {AX, BC, SF} 
Key3, {22, 22, 22}