2015-09-25 108 views
-1
public IEnumerable<SummaryItem> GetSummaryData(SummarySettings settings) 
{ 
    return GetSummaryReportData(startTime, endTime, settings.AgentIds); 
} 

在我写完我的代码之后,我意识到我需要在settings.AgentIds中添加一些ids找到两个集合的最有效方法是什么?

所以我这样做

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而不是Union

+0

1)这个实现有什么问题?什么让你担心? 2)聚合集合,它将集合减少为单个值3)联盟因为懒惰而非常快速,只是构建了一种链表。 – Andrey

+0

是的。我真的不明白你在问什么。你目前的实施有问题吗?它太慢了吗?如果清晰度是目标,我想你已经在那里了。 – spender

+0

@Andrey我担心速度和记忆力 – Anatoly

回答

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

正如你所看到的,它使用基于集合的集合,使工会。这利用哈希表的速度来确保操作非常高效。通过预先知道您要收集的数据,可以制定更优化的解决方案,但在一般情况下,这种方法尽可能快。

+0

我如何chage(in-place)我的设置.AgentIds?我的意思是只添加labelAgentIds而不创建新的GuidCollection – Anatoly

+0

这很大程度上取决于GuidCollection的实现。什么是GuidCollection?这真的值得吗?你有没有把这个代码作为一个性能热点?如果不是的话,我建议你继续前进,把时间花在更重要的事情上。 – spender

+0

它是一个'集合' – Anatoly

相关问题