我有一个内存中的“表”,可能看起来像这样:
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/