C# 是否有一个集合不仅可以按键查找项,还可以按项的属性查找项?

C# 是否有一个集合不仅可以按键查找项,还可以按项的属性查找项?,c#,collections,C#,Collections,我正在努力找出在我的收藏中找到物品的最有效的方法。首先,这里有一些更多的信息/要求: 秩序并不重要 必须不使用枚举查找 集合将非常大,但在最初创建后不会进行修改 人口稠密 必须能够按键(字符串)查找,但也能够按项类型的两个属性之一查找 我目前正在使用一个自定义集合,该集合继承自KeyedCollection,它使用GetKeyForItem()从项中提取一个字符串,用作键,到目前为止还可以 问题在于我希望能够查找项目的方式。我的理解是,除了“dirty”枚举之外,项的查找方法与添加项的方法相

我正在努力找出在我的收藏中找到物品的最有效的方法。首先,这里有一些更多的信息/要求:

  • 秩序并不重要
  • 必须使用枚举查找
  • 集合将非常大,但在最初创建后不会进行修改 人口稠密
  • 必须能够按键(字符串)查找,但也能够按项类型的两个属性之一查找
我目前正在使用一个自定义集合,该集合继承自KeyedCollection,它使用GetKeyForItem()从项中提取一个字符串,用作键,到目前为止还可以

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

我错过什么了吗?使用相同的项创建三个集合,但使用不同的GetKeyFoItem()实现来查找每个属性,这是可以接受的做法吗?或者还有其他我可以使用的收藏吗


我希望这些信息足以说明我的问题。如果你有什么建议,我将不胜感激

为此尝试使用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);
    }
公共类您的类
{
public int ClassIntProperty{get;set;}
公共字符串ClassStringProperty{get;set;}
}
List YourClassItemsList=新列表();
公共无效SeekItem()
{
//得到几个项目
var t=YourClassItemsList.Where(item=>item.ClassIntProperty==0).AsEnumerable();
var tt=YourClassItemsList.Where(item=>item.ClassStringProperty==“abc”).AsEnumerable();
//买一件
var ttt=YourClassItemsList.FirstOrDefault(item=>item.ClassIntProperty==0);
}

这就是我在查找项时需要做的,但会遍历集合,如果集合中有数千项,那么频繁调用该方法不会对性能产生很大影响吗?1)如何在不遍历整个集合的情况下查找集合中的项?O_O 2)了解有关LINQ和查询优化的更多信息!3) 您可以使用自己的迭代器而不是Linq。如果是这样的话,只有实验测试会告诉你你的迭代器是否比linq快!4) 如果您想在非常大的集合中查找Elemenet,那么您需要一个数据库!5) 您可以编写自己类型的collectin,它将支持索引等,但我认为这种解决方案不适合您……您可以使用Linq构建字典(唯一键)或查找(非唯一键)