【问题标题】:Is there a collection for looking up items not only by key, but also properties of an item?是否有一个集合不仅可以通过键查找项目,还可以通过项目的属性来查找?
【发布时间】:2018-01-13 02:40:42
【问题描述】:

我正在尝试找出在我的收藏中查找项目的最有效方法。首先这里有一些更多的信息/要求:

  • 顺序并不重要。
  • 必须使用枚举查找。
  • 集合将非常大,但在初始设置后不会被修改 已填充。
  • 必须能够通过键(字符串)进行查找,但也能够通过项目类型的两个属性之一进行查找。

我目前正在使用继承自 KeyedCollection 的自定义集合,它使用 GetKeyForItem() 从项目中提取字符串,用作键,到目前为止还不错。

问题在于我希望能够查找项目的方式。据我了解,除了“脏”枚举之外,查找项目时使用与添加时相同的方法,无论是使用自定义相等比较器还是键。

我错过了什么吗?为我希望能够查找的每个属性创建三个具有相同项目但具有不同 GetKeyFoItem() 实现的集合是否可以接受?或者还有其他我可以使用的集合吗?

我希望这些信息足以说明我的问题。我会很感激你的任何建议。

【问题讨论】:

  • 您可以使用 Linq 构建字典(唯一键)或查找(非唯一键)

标签: c# collections


【解决方案1】:

尝试为此使用 Linq! Linq 是非常强大的东西!

这是一个小例子......

    public class YourClass
    {
        public int ClassIntProperty { get; set; }
        public string ClassStringProperty { get; set; }
    }
    List<YourClass> YourClassItemsList = new List<YourClass>();

    public void SeekItem()
    {
        //Get several items
        var t = YourClassItemsList.Where(item => item.ClassIntProperty == 0).AsEnumerable();
        var tt = YourClassItemsList.Where(item => item.ClassStringProperty == "abc").AsEnumerable();

        //Get one item
        var ttt = YourClassItemsList.FirstOrDefault(item => item.ClassIntProperty == 0);
    }

【讨论】:

  • 这可以满足我在查找项目方面的需要,但会遍历集合,如果集合中有数千个项目,这不会对频繁调用该方法的性能产生很大影响?
  • 1) 你想如何在不迭代整个集合的情况下查找集合中的项目? O_o 2) 了解更多关于 LINQ 和查询优化的信息! 3)您可以使用自己的迭代器而不是 Linq。如果是这样,只有实验测试会告诉你你的迭代器是否比 linq 快! 4)如果你想在非常大的集合中查找元素,那么你需要一个数据库! 5)您可以编写自己的collectin类型,它将支持索引等,但我认为这样的解决方案不适合您......
猜你喜欢
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多