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);
}
}
}