两把钥匙比一把好

时间:2010-02-06 15:17:40

标签: c# .net algorithm data-structures

我有一个小部件类:

public class Widget
{
    ...
    public string UniqueID = "856D9PWW";
    public int Price = 325;
    public byte[] Data;
    ...
}

我想要一个数据结构来存储我的小部件。这是捕获 - 有时我需要根据它们的价格找到一组小部件,有时我需要根据它的ID找到一个特定的小部件。

我不想使用两个数据结构并在必要时使用它们,并且当我从第一个数据结构中删除它时将其从另一个数据结构中删除(这包括创建我自己的数据结构,在“封面”下执行此操作)。我想数据结构,允许我使用多个键,只需要使用其中一个键从中删除一个项目,并具有在其中一个键下存储多个项目的功能。

4 个答案:

答案 0 :(得分:7)

您可以创建自己的数据容器,以维护必要的数据结构,以允许使用两个键进行索引。如果您实现了一个标准容器接口,您甚至可以将此自定义容器用作任何其他框架容器(相同类型)。

由于您可以控制“添加/删除”方法,因此可以根据需要轻松确保不同的结构是更新。您还可以确保两个键的查找尽可能快。容器使用多个结构来实现不同查找的事实是实现细节。

答案 1 :(得分:4)

小部件列表是否足够?

List<Widget> widgetList = new List<Widget>();

widgetList.Add(new Widget(UniqueID, price, data));

//To query by UniqueID
Widget uniqueWidget =  widgetList.Single(x => x.uniqueID.Equals("123"));

//To query by price
List<Widget> widgetsByPrice = widgetList.Where(x => x.price.Equals(100.00));

//To remove
widgetList.Remove(uniqueWidget);

答案 2 :(得分:0)

没有神奇的容器可以做到这一点。数据库系统处理此问题的方式与您应该采用的方式相同:在您需要的每种访问方法上都有一个单独的索引。是的,它似乎很难看,但它是在多个字段上编制索引的唯一方法。如前所述,您可以将其封装在一个类中,该类处理为每个'索引'添加和删除元素。

答案 3 :(得分:-1)

要将数据存储在关系数据库中,您需要一个表来存储所有Widget数据(假设没有常见的可重复数据,例如应存储在查找表中的Widget类型 - 在Web上进行搜索用于数据库规范化。)

然后,一旦创建了数据表,您就可以使用数据库查询通过任何字段组合检索小部件。

如果您的意思是代码中的数据结构,只需创建一个列表类,例如

 public class Widgets : List<Widget>{


 } 

并根据您的搜索条件实施不同的Find方法。