C#检查值的最佳方法是在列表中多次存在
我有一个整数列表,我想知道一个值多次存在于我的列表中 最好的方法是什么 使用C#检查值的最佳方法是在列表中多次存在,c#,search,C#,Search,我有一个整数列表,我想知道一个值多次存在于我的列表中 最好的方法是什么 使用LookUp或dictionary或HashMap或 例如: List<int> samples = {5,4,6,2,1} // if(2 exist in samples) do something ... // if(3 exist in samples) do something ... // if(5 exist in samples) do something ... // if(8 exist
LookUp
或dictionary
或HashMap
或
例如:
List<int> samples = {5,4,6,2,1}
// if(2 exist in samples) do something ...
// if(3 exist in samples) do something ...
// if(5 exist in samples) do something ...
// if(8 exist in samples) do something ...
// if(13 exist in samples) do something ...
// if ....
List samples={5,4,6,2,1}
//如果(样本中有2个)做点什么。。。
//如果(样本中有3个)做点什么。。。
//如果(样本中有5个)做点什么。。。
//如果(样本中有8个)做点什么。。。
//如果(样本中有13个)做点什么。。。
//如果。。。。
您可以将它们存储在中,并使用O(1)
检查值是否存在:
此外,HashSet
防止存储重复项,因此速度非常快
更新:
列表
将使用O(N)进行搜索。为什么?因为大O符号应该考虑时间复杂度的最坏情况。假设我们有以下列表:
var numbers = new List<int> { 5, 4, 6, 2, 1 };
var number=新列表{5,4,6,2,1};
我们想找到编号1
。因此Contains()
方法的List
必须迭代整个数组,直到找到数字1
。所以我们有O(N)
LinkedList
将使用O(N)进行搜索。为什么?原因与列表中的相同。但是,LinkedList
在引擎盖下没有数组,它有一个类,该类有一个指向下一个元素的指针,下一个元素有指向下一个元素的指针,依此类推。我们必须迭代所有元素才能找到一个项
HashSet
将使用O(1)进行搜索。为什么?原因是引擎盖下的HashSet
不会遍历数组。它将运行内部方法InternalGetHashCode
,该方法返回数字在数组中的位置
此外,关于还有一个很好的答案,这取决于你所说的最佳。如果您使用的是列表,那么可以使用Exists()方法
“几次”-列表的内容会在两次测试之间发生变化吗?您可以使用HashSet
,但您可能会得到一个更为有意义的答案,但需要一些额外的细节/context。不,列表的内容不会发生变化最简单的方法可能就是使用。Contains({item})if(samples.Contains(2)){do something}“best”是上下文;“几次”是多少次?一打:只需使用包含。很多很多次,经常在一个紧密的循环中?您需要一个优化的数据结构,例如HashSet
,或者至少需要对其进行排序并使用二项式搜索进行检查。当然,它也取决于实际值的数量;如果它真的只有1,2,4,5,6-只需使用开关
块:您只需要针对更多的测试用例进行优化。请告诉我存在的顺序
这不是存在
的工作方式。它需要一个谓词
,而不是一个值。搜索列表效率低下。除非您有一个玩具应用程序,否则不应使用时间复杂度为O(n)的数据结构,即数组(或动态版本、列表)进行查找。更新答案以反映这一点。谢谢。即使有更新,也只需使用Contains()
。。。他们都是O(n)Exists()
除了在一个简单的列表中使用时变得更复杂之外,在这里没有任何好处。显然这里不应该使用列表,但这是另一种说法。谢谢@steppup,你能告诉我为什么不建议使用字典吗?或者其他什么?@Amir133因为字典存储一个键/值对,而您在这里只需要一个键-而不是一个值,HashSet
可以为您提供you@Amir133Dictionary
如果已经有要添加的键,则可以引发异常。此外,使用字典
你必须存储TValue
,但这对你来说是不必要的。@Amir133列表
和链接列表
将使用O(N)
搜索谢谢@steppup,你的答案对我来说已经足够了,但如果可能,请给观众更多解释。
if (unique.Contains(2))
// do something ...
var numbers = new List<int> { 5, 4, 6, 2, 1 };
if(samples.Exists(value => value == valueToCheck)){
//Do work
}