Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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# 用于简单查找的.NET工具?_C#_.net_Dictionary_Lookup - Fatal编程技术网

C# 用于简单查找的.NET工具?

C# 用于简单查找的.NET工具?,c#,.net,dictionary,lookup,C#,.net,Dictionary,Lookup,因此,我发现自己最近一直在按照这些思路编写代码 Dictionary<string, byte> dict = new Dictionary<string, byte>(); foreach(string str in arbitraryStringCollection) { if(!dict.ContainsKey(str)) { ProcessString(str); dict[str] = 0; } } Dictionary dict

因此,我发现自己最近一直在按照这些思路编写代码

Dictionary<string, byte> dict = new Dictionary<string, byte>();

foreach(string str in arbitraryStringCollection)
{
  if(!dict.ContainsKey(str))
  {
    ProcessString(str);
    dict[str] = 0;
  }
}
Dictionary dict=new Dictionary();
foreach(arbitraryStringCollection中的字符串str)
{
如果(!dict.ContainsKey(str))
{
进程字符串(str);
dict[str]=0;
}
}
这个例子过于笼统,但我发现自己的共同目标是“我已经做过这个了吗?”

我喜欢使用Dictionary进行快捷键查找,但因为我从不关心value字段,所以我忍不住觉得它有点过分,即使它只是每个条目一个字节


有没有更好的.NET工具可以实现这一点,它具有字典的键查找速度,但没有任意和不必要的值?

您应该使用
HashSet


您应该使用
HashSet


没有一个工具或库可以实现这一点,但是您可以将此代码重构为不太冗长的代码。例如,可以使用该方法简化代码的原样

您可以使用某种方法进一步重构它,或者将整个内容重构为扩展方法

或者,如果您的需求稍有不同(例如,您希望在应用程序的生命周期内保持
dict
),则可以以稍有不同的方式对其进行重构,例如

HashSet<string> dict = new HashSet<string>();

foreach(string str in arbitraryStringCollection)
{
    dict.DoOnce(str, ProcessString);
}

// Re-usable extension method)
public static class ExtensionMethods
{
    public static void DoOnce<T>(this ISet<T> set, T value, Action<T> action)
    {
        if (!set.Contains(value))
        {
            action(value);
            set.Add(value);
        }
    }
}
HashSet dict=newhashset();
foreach(arbitraryStringCollection中的字符串str)
{
dict.DoOnce(str,ProcessString);
}
//可重用扩展方法)
公共静态类扩展方法
{
公共静态无效状态(此ISet集合、T值、动作)
{
如果(!set.Contains(value))
{
作用(价值);
增加(价值);
}
}
}

没有用于此目的的工具或库,但是您可以将此代码重构为不太冗长的代码。例如,可以使用该方法简化代码的原样

您可以使用某种方法进一步重构它,或者将整个内容重构为扩展方法

或者,如果您的需求稍有不同(例如,您希望在应用程序的生命周期内保持
dict
),则可以以稍有不同的方式对其进行重构,例如

HashSet<string> dict = new HashSet<string>();

foreach(string str in arbitraryStringCollection)
{
    dict.DoOnce(str, ProcessString);
}

// Re-usable extension method)
public static class ExtensionMethods
{
    public static void DoOnce<T>(this ISet<T> set, T value, Action<T> action)
    {
        if (!set.Contains(value))
        {
            action(value);
            set.Add(value);
        }
    }
}
HashSet dict=newhashset();
foreach(arbitraryStringCollection中的字符串str)
{
dict.DoOnce(str,ProcessString);
}
//可重用扩展方法)
公共静态类扩展方法
{
公共静态无效状态(此ISet集合、T值、动作)
{
如果(!set.Contains(value))
{
作用(价值);
增加(价值);
}
}
}

如果您从不需要键值对中的值,为什么不采用类似于
列表(重复项)或
哈希集(无重复项)这样的数据结构?这样的方法对您不起作用吗?这很难放到上下文中,但我可以想象,有一种方法可以多次将相同的值用作输入。如果可以解决这个问题,您甚至可能不需要像代码示例中那样进行额外的检查。如果您从来都不需要键值对中的值,为什么不使用数据结构,比如
列表(重复项)或
哈希集(无重复项)?这样的东西对您不起作用吗?这很难放到上下文中,但我可以想象,有一种东西允许相同的值多次用作输入。如果您可以解决这个问题,您甚至可能不需要像代码示例中那样进行额外的检查。因此,
哈希集
字典
性能更好,而且更适合OP的要求。OPs的问题是他们必须编写的代码量——使用HashSet根本没有帮助。@Justin这里有一个简短的版本供您参考。我没有投反对票,但您的答案假设OP在foreach循环后不需要值。这一点,
哈希集
字典
更有效,而且更适合OP的要求。OPs的问题是他们必须编写的代码量——使用HashSet根本没有帮助。@Justin这里有一个简短的版本供您参考。我没有投反对票,但您的答案假设OP不需要foreach循环之后的值。
foreach (var str in arbitraryStringCollection.Distinct())
{
    ProcessString(str)
}
HashSet<string> dict = new HashSet<string>();

foreach(string str in arbitraryStringCollection)
{
    dict.DoOnce(str, ProcessString);
}

// Re-usable extension method)
public static class ExtensionMethods
{
    public static void DoOnce<T>(this ISet<T> set, T value, Action<T> action)
    {
        if (!set.Contains(value))
        {
            action(value);
            set.Add(value);
        }
    }
}