2015-09-25 5 views
-1
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, но не Union?

+0

1) Что не так с этой реализацией? Что заставляет вас беспокоиться? 2) Совокупные агрегаты, сводя коллекцию к единому значению. 3) Союз невероятно быстрый, потому что он ленив, просто создает вид связанного списка. – Andrey

+0

Да. Я не совсем понимаю, о чем вы просите. Есть ли проблема с вашей текущей реализацией? Это слишком медленно? Если ясность является целью, я думаю, вы уже там. – spender

+0

@ Andrey Im, беспокоясь о скорости и воспоминаниях – 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

. Как я могу использовать (на месте) мои настройки.AgentIds? Я имею в виду просто добавить labelAgentIds без создания нового GuidCollection – Anatoly

+0

. Это очень сильно зависит от реализации GuidCollection. Что такое GuidCollection? Это действительно стоит? Вы изолировали этот код как точку доступа производительности? Если нет, я предлагаю вам двигаться дальше и тратить свое время на более важные вопросы. – spender

+0

Его сборник ' – Anatoly

Смежные вопросы