c# - 在 C# 中,是否有开箱即用的方法来构建 3 向查找表?

标签 c# lookup

我有一个内存中的“表”,可能看起来像这样:

Favorite#  Name        Profession
---------  ----------  ------------------
3          Names.Adam  Profession.Baker
9          Names.Bob   Profession.Teacher
7          Names.Carl  Profession.Coder
7          Names.Dave  Profession.Miner
5          Names.Fred  Profession.Teacher

我想做的是使用 3 个字段中的任何一个进行快速高效的查找。 换句话说,我想要:

  • myTable[3]myTable[Names.Adam]myTable[Professions.Baker]全部返回{3,Names.Adam,Profession.Baker}
  • myTable[Profession.Teacher]返回两个 {9,Names.Bob,Profession.Teacher}{5,Names.Fred,Profession.Teacher} .

该表是在运行时根据用户的操作构建的,并且不能存储在数据库中,因为它用于无法保证数据库连接的部分。

现在,我“简单地”(哈哈!)使用 3 个 super 词典存储它,每个 super 词典使用其中一列(FavoriteNumber、姓名、职业)作为键控, super 词典中的每个值都包含 2 个字典,它们是自己与剩余的每一列键控(因此“名称” super 字典中的值属于 Dictionary<FavoriteNumber,Profession[]>Dictionary<Profession, FavoriteNumber[]>

这需要在 2 个字典中进行 2 次查找,以及另一个数组遍历(通常包含 1 或 2 个元素。)

谁能建议一个更好的方法来做到这一点?我不介意花费额外的内存,因为该表可能很小(不超过 20 个条目),但我愿意牺牲一点 CPU 来使其更易于维护代码...

最佳答案

不是真的但是使用字典,但是如果你像这样创建一个类的集合

class Person {
    public int FavoriteNumber;
    public string Name;
    public string Profession;
}

您可以使用 LINQ 来搜索集合。

IList<Person> people = /* my collection */;
var selectedPeople = people.Where(p => p.FavoriteNumber = 3);
var selectedPeople2 = people.Where(p => p.Name == "Bob");
var selectedPeople3 = people.Where(p => p.Profession = "Teacher");

或者如果您更喜欢普通的 LINQ 语法

var selectedPeople4 = from p in people
                      where p.Name == "Bob"
                      select p;

这些中的每一个 selectedPeople变量将被键入为 IEnumerable<Person>您可以使用循环来搜索它们。

关于c# - 在 C# 中,是否有开箱即用的方法来构建 3 向查找表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/515887/

相关文章:

r - 使用 R(或者 Excel)组合数据——循环匹配刺激

Tomcat 6 和 DNS 查找

c++ - 在 Visual C++ 中执行此操作的更好方法是什么?

javascript - 为了建立价格查询服务或价格比较服务,我需要什么?

time - 建议一种查找时间复杂度最小的好方法

C#:强制监视器进入待机模式

c# - 如何测量 WPF Silverlight FPS 或渲染时间?

c# - StatusBar 消息实现超时

c# - 实体被移动而不是添加

C# UWP - HttpClient 响应问题\u001...无法反序列化