我在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");
或者有没有更好的收藏来解决这个问题?
答案 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
中的Name
和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中查看输出。
答案 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");