【问题标题】:better alternative to C# contains method [duplicate]C#的更好替代包含方法[重复]
【发布时间】:2017-11-19 12:37:32
【问题描述】:

在 C# 中使用 Contains 方法是否有更快的替代方法?

这是一个看起来像我正在尝试做的示例,但我读到 Contains 是一种昂贵的方法,我想找到更好的替代方法,因为速度很重要。

    public List<Guid> getCumulativeListByUsername(string username)
    {
        List<Guid> CombinedList = new List<Guid>();
        List<Guid> ListA = new List<Guid>();
        List<Guid> ListB = new List<Guid>();

        ListA = getListAFromDatabase(username);
        ListB = getListBFromDatabase(username);

        CombinedList = ListA;

        foreach (Guid x in ListB)
        {
            if (!CombinedList.Contains(x))
            {
                CombinedList.Add(x);
            }
        }
        return CombinedList;
    }

如果你也能解释你的推理,我们将不胜感激。

【问题讨论】:

  • “我读到 Contains 是一种昂贵的方法” - 你在实践中注意到了吗?你在哪里读到的,他们有没有提供替代品?如果不是,您的研究表明了什么?对此的实际答案是使用 HashSet 或 Dictionary,我相信您一定也读过吗?
  • 您是否遇到任何实际的性能问题?
  • 如果你从一个数据库中拉出 2 个列表,或者在那里合并,数据库擅长集合操作。
  • 为什么不Intersect

标签: c# list contains


【解决方案1】:

不确定性能,您需要提供有关列表长度、可能发生冲突等的详细信息。但您可以使用 Linq 缩短代码:

return ListA.Union(ListB).ToList();

我想先证明存在性能问题,然后再尝试任意提高性能并且很可能降低代码的可读性。

【讨论】:

  • 投票,但你不需要 Distinct 那里,Union 在里面做
  • @gabba "voteup" - 为什么?并不是说我对这个答案投了反对票,但它没有包含任何解释,也没有证明这比 OP 的代码更快。问题不是关于缩短代码(这是答案提供的),而是关于提高性能(它没有证明)。
  • 大多数时候 Linq 比直接迭代要慢。
  • @CodeCaster,导致它比答案更容易阅读和更简短的解决方案
  • @gabba 这不是问题所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-24
相关资源
最近更新 更多