如何获得相应的名称'反对' Id'两个字典键

时间:2017-05-11 09:49:43

标签: 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" });

反对每个&#34; Id&#34; key,&#34; Name&#34;键。

注意 - 名称对每个ID

都是唯一的

现在,我需要来自&#34; Name&#34;的所有值。对于(A&amp; C)对应的&#34; Id&#34;键值为3。

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

或者有没有更好的收藏来解决这个问题?

5 个答案:

答案 0 :(得分: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对应的情况下才有效。)

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

请检查:

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中查看输出。

答案 3 :(得分:0)

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

一种替代方法是使用字典并在Key中存储名称和在Value中存储Id。

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

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

答案 4 :(得分:-1)

为什么不使用常规词典?

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