HashSet&用于存储字符串的列表

时间:2010-10-19 20:55:05

标签: c#

晚安,

我试图在C#中对HashSet和List数据类型的性能进行基准测试,以检查在需要进行大量插入/删除时哪一个表现最佳。我使用的代码大致如下。

public static Func<String, HashSet<String>> ListaPossiveisCorreccoes = StrPalavra => {

        (...)
        HashSet<String> ListaCorreccoes = new HashSet<String> ();
        (...)

        (Lots of .Add operations)

        return ListaCorreccoes;

    };


    public static Func<String, IEnumerable<String>> ListaCorreccoes = (StrPalavra) =>
    {


        HashSet<String> ConjuntoCorreccoes = new HashSet<String> ( );

        foreach (String StrTmp in ListaPossiveisCorreccoes(StrPalavra))
            foreach (String StrTmp2 in ListaPossiveisCorreccoes(StrTmp))
                ConjuntoCorreccoes.Add(StrTmp2);

        return ConjuntoCorreccoes/*.Distinct()*/.Where(PalavraConhecida)*/;

    };

当我运行sequentaly时,上面列出的两个函数需要大约250-285ms来完成(我正在使用memoization)。但是,如果我将HashSet<String>替换为List<String>,并取消注释最后一行的注释部分(从而强制从列表中删除重复项),则只需140-145毫秒即可完成。这与我读到的关于HashSets的内容相矛盾,HashSets表示它们的性能比添加/删除操作中的列表要好得多。有人可以告诉我这是否正常? 250ms当然不是很多,但它几乎是列表所用时间的两倍,这很重要,因为这些函数是为了重复调用。

非常感谢。

2 个答案:

答案 0 :(得分:2)

从问题

  

这与我读到的内容相矛盾   HashSets,说他们的   性能要好得多   添加 /删除中的列表   操作

我不确定您在哪里阅读HashSet<T>Lis<T>相比,相对于Add,性能更快。这完全是错的。

List<T>.Add特别优于HashSet<T>.Add。在大多数情况下,Add List<T>只是对数组索引的赋值和索引的增量。对HashSet<T>来说要复杂得多。

删除更复杂,并且很大程度上取决于元素是否从集合的begininig,end或middle中删除。

答案 1 :(得分:0)

这不是我的,但确实有一些有趣的信息。

http://www.phase9studios.com/post/2008/01/08/DictionaryVSHashTable.aspx

我一直认为散列表更适合查找值。您可以在查找中获得性能提升,而不是插入。