列表查找、哈希集或Linq列表中哪个更好
我有一个字符串列表,我想在其中找到特定的值并返回。 如果我只想搜索,我可以使用Hashset而不是list列表查找、哈希集或Linq列表中哪个更好,linq,list,c#-3.0,Linq,List,C# 3.0,我有一个字符串列表,我想在其中找到特定的值并返回。 如果我只想搜索,我可以使用Hashset而不是list HashSet<string> data = new HashSet<string>(); bool contains = data.Contains("lokendra"); // 我们是否有任何linq或任何其他方法可以使检索数据的速度更快。 请帮忙 public struct Employee { public str
HashSet<string> data = new HashSet<string>();
bool contains = data.Contains("lokendra"); //
我们是否有任何linq或任何其他方法可以使检索数据的速度更快。
请帮忙
public struct Employee
{
public string role;
public string id;
public int salary;
public string name;
public string address;
}
我有这个结构的列表,如果name属性与“LokDra”值匹配,那么我想重整整个对象。把列表看作是雇员数据。< /P>
我想知道我们有Hashset来加快搜索速度的方法,我们可以搜索数据并快速返回,而不是查找。您可以尝试使用
employeeData.FirstOrDefault(e=>e==“lokendra”)
,但它仍然需要在集合上迭代,因此将有性能列表find
方法
如果你的列表内容只设置一次,然后你一次又一次地搜索它,你应该考虑实现你自己的解决方案:
- 第一次搜索前对列表进行排序
- 使用二进制搜索(对于标准的
和Find
,它将是O(logn)而不是O(n))Where
employeeData.FirstOrDefault(e=>e==“lokendra”)
,但它仍然需要在集合上迭代,因此将有性能列表Find
方法
如果你的列表内容只设置一次,然后你一次又一次地搜索它,你应该考虑实现你自己的解决方案:
- 第一次搜索前对列表进行排序
- 使用二进制搜索(对于标准的
和Find
,它将是O(logn)而不是O(n))Where
字典。构建一次,您就可以多次高效地查询它。您可以轻松地从员工列表中构建它:
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
类型。您几乎肯定想要一个类,一个具有属性而不是公共字段的类。听起来您实际上想要的是一个字典。构建一次,您就可以多次高效地查询它。您可以轻松地从员工列表中构建它:
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
类型。您几乎肯定想要一个类,一个具有属性而不是公共字段的类。您所说的“我还想从列表中返回值”是什么意思?你知道这个值——你正在检查它,所以它总是“lokendra”。请澄清你的问题。@Jon Skeet。我想从列表中找出列表是否包含值,实际上它是一个对象列表,因此如果name属性匹配,那么我将返回整个对象。这完全改变了问题的性质。您的实际情况与您描述的不匹配。只是想知道我的案例中的性能,不想发布项目中的代码,所以采用了简单的类似场景。对不起,乔恩·斯基特,但问题是这不一样。在您的问题中描述的情况下,HashSet
就可以了。您所说的“我也想从列表中返回值”是什么意思?你知道这个值——你正在检查它,所以它总是“lokendra”。请澄清你的问题。@Jon Skeet。我想从列表中找出列表是否包含值,实际上它是一个对象列表,因此如果name属性匹配,那么我将返回整个对象。这完全改变了问题的性质。您的实际情况与您描述的不匹配。只是想知道我的案例中的性能,不想发布项目中的代码,所以采用了简单的类似场景。对不起,乔恩·斯基特,但问题是这不一样。在你问题中描述的情况下,HashSet
就可以了。你是对的MarcinJuraszek。。我试过了,但性能是一样的。@MarcinJuraszek。实际上我有一个对象列表。如果一个属性与传递给它的值匹配,那么将返回整个对象。好的,但是,您的列表内容在搜索之间会发生变化吗?我有一个列表,如果在lis中找不到数据,则会添加内容,还有一个场景是,仅在列表中进行搜索。这两个场景都是不同的列表。您是对的MarcinJuraszek。。我试过了,但性能是一样的。@MarcinJuraszek。实际上我有一个对象列表。如果一个属性与传递给它的值匹配,那么将返回整个对象。好的,但是,您的列表内容在搜索之间会发生变化吗?我有一个列表,如果在lis中找不到数据,则会添加内容,还有一个场景,即仅在列表中进行搜索。这两个列表都是不同的。我可以同时匹配姓名和id吗?因为可能有两名员工的姓名相同。怎么做?@lokendrajayaswal:我不去在细化需求的同时不断更新我的答案。我建议你删除这个问题,然后问一个新的问题和你的所有要求。。。否则它就是毫无意义的。我尝试删除此项。但不起作用,但您的第一个答案满足我的要求,在其他情况下,我只想检查列表是否包含数据库中的表名。现在速度非常快。。将在同一个问题上提出新问题。@Jon Skeet先生我已经发布了该问题,请帮助。我可以匹配这两个问题吗姓名和id,因为可能有两个同名的员工。如何做到这一点?@lokendrajayaswal:我不会在你细化需求时不断更新我的答案。我建议你删除这个问题,然后问一个新的问题和你的所有要求。。。否则它就是毫无意义的。我尝试删除此项。但不起作用,但您的第一个答案满足了我的要求。在其他情况下,我只想检查列表是否包含来自数据库的表名。现在速度非常快。我将在同一个问题上提出新问题。@Jon Skeet先生我已经发布了该问题,请帮助。