Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#检查值的最佳方法是在列表中多次存在_C#_Search - Fatal编程技术网

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@Amir133
Dictionary
如果已经有要添加的键,则可以引发异常。此外,使用
字典
你必须存储
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
}