如何针对两个字典键的'Id'获取相应的'Name'

  • 本文关键字:Id 获取 Name 字典 何针 两个 c#
  • 更新时间 :
  • 英文 :


我有一个C#字典,如下所示,

        var data = new Dictionary<string, List<string>>();
        data.Add("Id", new List<string> { "3", "5", "3" });
        data.Add("Name", new List<string> { "A", "B", "C" });

针对每个"Id"键,"名称"键中都有一个相应的值。

注意 - 名称对每个 ID 都是唯一的

现在,我需要 (A & C( 的"Name"中的所有值,其中相应的"Id"键值为 3。

var a = data["Id"].Where(b => b == "3");

或者有更好的集合来解决这个问题吗?

Zip方法应该可以帮助您:

var names = data["Id"].Zip(data["Name"], (a,b) => new { Id = a, Name = b})
                      .Where(x => x.Id == 3)
                      .Select(x => x.Name);

(请注意,仅当两个列表之间保证有 1-1 的对应关系时,这才有效。

在您定义的范围内,更合适的结构是:

var data = new Dictionary<string, List<string>>;
data.Add("3", new List<string> { "A", "C" });
data.Add("5", new List<string> { "B" });

其中,字典的键是 ID,值是与该 ID 匹配的名称列表。

根据您的示例数据,IdName的索引在Dictionary中是相同的。因此,您必须根据自己的条件找到所有索引,然后使用这些索引获取所有名称。

请检查此内容:

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
    public static void Main()
    {
        var data = new Dictionary<string, List<string>>();
        data.Add("Id", new List<string> { "3", "5", "3" });
        data.Add("Name", new List<string> { "A", "B", "C" });
        //var a = data["Id"].FindIndex(b => b == "3");
        int[] indexs = data["Id"].Select((b,i) => b == "3" ? i : -1).Where(i => i != -1).ToArray();
        foreach(var index in indexs)
        {
            Console.WriteLine(data["Name"][Convert.ToInt16(index)]);
        }   
    }
}

您可以在DotNetFiddle中检查输出。

我认为您可以更改当前存储这些值的方式。

一种替代方法是使用字典并将名称存储在键中,将 ID 存储在值中。

var data = new Dictionary<string, int>();
data.Add("A", 3);
data.Add("B", 5);
data.Add("C", 3);

如果您有时还想使用 Name 来访问 Id,但如果您只打算使用 Id 来查找名称,请使用另一个答案中的解决方案。

你为什么不直接使用常规词典呢?

        var dict = new Dictionary<string, string[]> {{"3", new[] {"A", "C"}}, {"5", new[] {"B"}}};
        var a = dict.Where(x => x.Key == "3");

最新更新