Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/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
.net 搜索列表中的项目列表_.net_C# 4.0 - Fatal编程技术网

.net 搜索列表中的项目列表

.net 搜索列表中的项目列表,.net,c#-4.0,.net,C# 4.0,最初我有以下代码 var list = new Dictionary<string, int>(); list.Add("abcd", 1); list.Add("abc", 12); list.Add("def", 14); 我的问题来了 若我有一个搜索词列表,那个么如何在列表中搜索这些项。我不想为此使用for循环。是否有任何内置功能或我需要编写扩展方法 List<string> searchList = new List<string>(); searc

最初我有以下代码

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);
我的问题来了

若我有一个搜索词列表,那个么如何在列表中搜索这些项。我不想为此使用for循环。是否有任何内置功能或我需要编写扩展方法

List<string> searchList = new List<string>();
searchList.Add("abc") ;
searchList.Add("def") ;
List searchList=newlist();
搜索列表。添加(“abc”);
搜索列表。添加(“def”);

搜索列表中查找所有项目
列表中查找所有项目

我建议对搜索列表使用哈希集,然后执行以下操作:

HashSet<string> searchList = new HashSet<string>();
searchList.Add("abc");
searchList.Add("def");

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

list.Where(p => searchList.Contains(p.Key));
HashSet searchList=newhashset();
搜索列表。添加(“abc”);
搜索列表。添加(“def”);
var list=newdictionary();
列表。添加(“abcd”,1);
添加(“abc”,12);
列表。添加(“def”,14);
其中(p=>searchList.Contains(p.Key));

这将防止每次执行Where子句时对搜索列表执行O(n)操作,因为查找应接近O(1)

我建议对搜索列表使用哈希集,然后执行以下操作:

HashSet<string> searchList = new HashSet<string>();
searchList.Add("abc");
searchList.Add("def");

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

list.Where(p => searchList.Contains(p.Key));
HashSet searchList=newhashset();
搜索列表。添加(“abc”);
搜索列表。添加(“def”);
var list=newdictionary();
列表。添加(“abcd”,1);
添加(“abc”,12);
列表。添加(“def”,14);
其中(p=>searchList.Contains(p.Key));
这将防止每次执行Where子句时在搜索列表上执行O(n)操作,因为查找应接近O(1)

您可以使用以下界面:

public class EqualityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return y.Contains(x);
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}
只需自己添加空检查。

您可以使用以下界面:

public class EqualityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return y.Contains(x);
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

只需自己添加空检查。

它将内容与搜索项相匹配,因此,如果列表中有“abc def”,而搜索列表中有“def”,它就找不到它。我明白了,那么我认为这里的方法不正确。如果您需要一个合适的搜索算法,我会重新考虑这种方法,并可能考虑对您的可搜索项目进行简单的索引。它将内容与搜索项目相匹配,因此如果列表中有“abc def”,而搜索列表中有项目“def”,它就找不到。我明白了,那么我认为这里的方法是不正确的。如果你需要一个合适的搜索算法,我会重新考虑这种方法,并可能考虑对你的可搜索项目建立一个简单的索引。我强烈警告不要写这样一个IEqualityComparer。它没有一个像对称一样基本的属性:
Equals(a,b)=>Equals(b,a)
@Ani,这是一个由问题隐式定义的等式,我不知道有没有更好的解决方案,是否保存这个等式(我没有考虑),我知道你想让我参考msdn,但这个等式用于此目的,并且在名称行ContainEquality中,它将区别于一般的等式;我只是觉得读者注意到这一点很重要。如果他们将其用于其他目的,可能会遇到问题。我强烈警告不要编写这样一个IEqualityComparer。它没有一个像对称一样基本的属性:
Equals(a,b)=>Equals(b,a)
@Ani,这是一个由问题隐式定义的等式,我不知道有没有更好的解决方案,是否保存这个等式(我没有考虑),我知道你想让我参考msdn,但这个等式用于此目的,并且在名称行ContainEquality中,它将区别于一般的等式;我只是觉得读者注意到这一点很重要。如果将其用于其他目的,他们可能会遇到问题。搜索列表中的“abc”是否应同时匹配“abc”和“abcd”?搜索列表中的“abc”是否应同时匹配“abc”和“abcd”?
var lst1 = list.Where(p => searchList.Any(x => p.Key.Contains(x)));