找到两个集合的最有效方法是什么?

时间:2015-09-25 09:58:33

标签: c# algorithm linq

<ul class="menu-l1">
    <li><a href="#">first menu</a>
        <div class="details">
            <div>header</div>
            <ul class="menu-l2">
                <li><a href="#">sub</a></li>
                <li><a href="#">sub long</a></li>
            </ul>
        </div>
    </li>
    <li><a href="#">second menu</a>
        <div class="details">
            <div>2 header</div>
            <ul class="menu-l2">
                <li><a href="#">1 sub-menu long</a></li>
                <li><a href="#">2 sub-menu</a></li>
            </ul>
        </div>
    </li>
</ul>

在我编写代码后,我意识到我需要向public IEnumerable<SummaryItem> GetSummaryData(SummarySettings settings) { return GetSummaryReportData(startTime, endTime, settings.AgentIds); } 添加一些ids

所以我做了以下

settings.AgentIds

如何改进我的算法以组合两个集合?

也许没有创建public IEnumerable<SummaryItem> GetSummaryData(SummarySettings settings) { if (settings.LabelIds != null && settings.LabelIds.Any()) { var labelGroups = _agentsGroupsStorage.Values.Where(x => settings.LabelIds.Contains(x.Id)); var labelAgentIds = labelGroups.SelectMany(x => x.AgentIds); // IEnumerable<Guid> settings.AgentIds = new GuidCollection(labelAgentIds.Union(settings.AgentIds).ToList()); } return GetSummaryReportData(startTime, endTime, settings.AgentIds); } ?或者我需要使用new GuidCollection而不是Aggregate

1 个答案:

答案 0 :(得分:3)

以下是联盟的大致实施:

public IEnumerable<T> Union(this IEnumerable<T> left, IEnumerable<T> right)
{
    var hs=new Hashset<T>(left);
    for(var item in right)
    {
        hs.Add(item);
    }
    return hs;
}

如您所见,它使用基于集合的集合来建立联合。这利用了哈希表的速度,使操作确实非常高效。有可能通过预先知道您要收集的数据来制定更优化的解决方案,但在一般情况下,这是最快的。