首页 > 解决方案 > 通过 key -updated 查找键值对列表的索引

问题描述

我正在创建一个键值对列表。

var myList = new List<KeyValuePair<string, int>>();
myList.Add(new KeyValuePair<string, int>("A", 1));
myList.Add(new KeyValuePair<string, int>("B", 2));
myList.Add(new KeyValuePair<string, int>("A", 1));
myList.Add(new KeyValuePair<string, int>("C", 3));
myList.Add(new KeyValuePair<string, int>("A", 5));
myList.Add(new KeyValuePair<string, int>("X", 9));
myList.Add(new KeyValuePair<string, int>("Z", 7));

我想通过键值对的键找出这个列表的索引。因此,A 的索引为 0,2 和 4,Z 的索引为 6。

要查找仅存在一次的索引,我可以执行以下操作..

int o = myList.IndexOf((from val in myList where val.Key == "Z" select val).SingleOrDefault());

但是我如何获得 val.Key == "A" 的索引。

有人建议我查看问题Get index of all matching values from list using Linq并关闭了我的问题,尽管我的问题是关于 keyvaluepair 列表和上述关于字符串列表的问题......

基于此,我尝试不成功..

var result = Enumerable.Range(0, myList.Count)
             .Where(kvp => kvp.Key == "A")
             .ToList();

var result1 =   myList.Select((x, i) => new {x, i})
                  .Where(x => x.Key == "A")
                  .Select(x => x.i);

收到的错误:

编译错误:“int”不包含“Key”的定义,并且找不到接受“int”类型的第一个参数的扩展方法“Key”(您是否缺少 using 指令或程序集引用?)编译错误: “AnonymousType#1”不包含“Key”的定义,并且找不到接受“AnonymousType#1”类型的第一个参数的扩展方法“Key”(您是否缺少 using 指令或程序集引用?)

真诚地感谢人们回答问题或允许其他人回答而不是关闭它们。

标签: c#

解决方案


您可以通过执行以下操作来实现此目的:

public List<int> GetIndices(List<KeyValuePair<string, int>> myList, string query)
{
    List<int> indices = new List<int>();
    for (int i = 0; i < myList.Count; i++)
    {
        if (myList[i].Key == query) indices.Add(i);
    }

    return indices;
}

以下适用于任何类型:

public List<int> GetIndices<T, K>(List<KeyValuePair<T, K>> myList, T query)
{
    List<int> indices = new List<int>();
    int i = 0;
    myList.ForEach((pair) => { if (pair.Key.Equals(query)) indices.Add(i); i++; });
    return indices;
}

推荐阅读