用于简单查找的.net工具

本文关键字:net 工具 查找 简单 用于 | 更新日期: 2023-09-27 17:53:28

所以我发现自己最近在写这些代码。

Dictionary<string, byte> dict = new Dictionary<string, byte>();
foreach(string str in arbitraryStringCollection)
{
  if(!dict.ContainsKey(str))
  {
    ProcessString(str);
    dict[str] = 0;
  }
}

这个例子过于笼统,但我发现自己的共同目标是"我已经做过这个了吗?"

我喜欢使用Dictionary进行快速键查找,但由于我从不关心值字段,我不禁觉得它有点过分,即使它只是每个条目一个字节。

有没有更好的。net工具可以做到这一点,有字典的键查找速度,但没有任意和不必要的值?

用于简单查找的.net工具

您应该使用HashSet<T>

HashSet<string> hashSet= new HashSet<string>();
foreach(string str in arbitraryStringCollection)
{
    if(!hashSet.Contains(str))
    {
        ProcessString(str);
        hashSet.Add(str);
    }
}

让它更短:

foreach(string str in arbitraryStringCollection)
{
    if(hashSet.Add(str)) ProcessString(str);
}

没有相应的工具或库,但是您可以重构这段代码以减少冗长。例如,代码可以使用Distinct方法简化。

foreach (var str in arbitraryStringCollection.Distinct())
{
    ProcessString(str)
}

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

或者,如果您的需求略有不同(例如,您希望在应用程序的生命周期中保留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);
        }
    }
}