我有一个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 匹配的名称列表。
根据您的示例数据,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中检查输出。
我认为您可以更改当前存储这些值的方式。
一种替代方法是使用字典并将名称存储在键中,将 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");