列表查找,Hashset或Linq哪一个更好列表

时间:2013-04-04 11:49:58

标签: linq list c#-3.0

我有一个字符串列表,我想找到特定的值并返回。 如果我只想搜索,我可以使用Hashset而不是列表

 HashSet<string> data = new HashSet<string>();    
 bool contains = data.Contains("lokendra"); // 

但是对于列表我正在使用Find因为我想从列表中返回值。 我发现这个方法很耗时。此代码所在的方法是hit more than 1000 times,列表大小为appx 20000 to 25000。此方法需要时间。还有其他方法可以让搜索更快。

List<Employee> employeeData= new List<Employee>();
var  result = employeeData.Find(element=>element.name=="lokendra")

我们是否有任何linq或任何其他方法可以更快地从搜索中检索数据。 请帮忙。

 public struct Employee
    {
        public string role;
        public string id;
        public int salary;
        public string name;  
        public string address;          
    }

我有这个结构的列表,如果name属性匹配值“lokendra”。那么我想重新整理整个object.Consider列表作为员工数据。

我想知道我们使用Hashset获得更快搜索的方式无论如何我们可以搜索数据并快​​速返回而不是查找。

2 个答案:

答案 0 :(得分:3)

听起来实际上想要的是Dictionary<string, Employee>。构建一次,您可以多次有效地查询它。您可以轻松地从员工列表中构建它:

var employeesByName = employees.ToDictionary(e => e.Name);
...

var employee;
if (employeesByName.TryGetValue(name, out employee))
{
    // Yay, found the employee
}
else
{
    // Nope, no employee with that name
}
编辑:现在我看到了你的编辑... 不要像这样创建struct类型。你几乎肯定想要一个class,一个有属性而不是公共领域......

答案 1 :(得分:0)

您可以尝试使用employeeData.FirstOrDefault(e => e == "lokendra"),但仍需要对集合进行迭代,因此将使用性能列表Find方法。

如果您的列表内容只设置了一次,然后您一次又一次地搜索它,那么您应该考虑实施自己的解决方案:

  • 首次搜索前的排序列表
  • 对标准FindWhere使用二进制搜索( O(log n)而不是 O(n) < / LI>