2015-09-25 137 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

相關問題