Пересечение списков - PullRequest
       8

Пересечение списков

4 голосов
/ 18 ноября 2011

Есть ли лучший, более элегантный и лаконичный способ пересечения двух списков в C #?

В C # метод для вычисления пересечения списка дат:

    public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
    {
        var dt1 = new HashSet<DateTime>(ts1.dates);
        var dt2 = new HashSet<DateTime>(ts2.dates);
        dt1.IntersectWith(dt2);
        var dt = new DateTime[dt1.Count];
        dt1.CopyTo(dt);
        return new List<DateTime>(dt);
    }

В Ruby это можно сделать так:

def dates_common(ts1, ts2)
    dt1 = ts1.dates.to_set    
    dt2 = ts2.dates.to_set
    return dt1.intersection(dt2).to_a
end

Коренная причина этой неловкости - асимметрия между IEnumerable и конкретными контейнерами и массивами.

Я постоянно удивляюсь, насколько плохо спроектированы стандартные библиотеки C #, так как подобные проблемы возникают постоянно.

Есть ли лучший, то есть более элегантный и лаконичный способ сделать это?

Ответы [ 2 ]

17 голосов
/ 18 ноября 2011

Вы можете использовать Enumerable.Intersect и Enumerable.ToList методы расширения , чтобы получить очень элегантный и лаконичный код:

public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
{
    return ts1.dates.Intersect(ts2.dates).ToList();
}
0 голосов
/ 15 февраля 2013
    // This function is used to remove those alias from 'cc' which are common in 'to' and 'cc' list.

    private static void RemoveCommonFromCc(ref List<string> to, ref List<string> cc)
    {
        IEnumerable<string> common = (List<string>)to.Intersect(cc);
        foreach(var removeCc in common)
        {
            cc.Remove(removeCc);
        }
    }
...