5 Stimmen

Kreuzung von Listen

Gibt es einen besseren, eleganteren und prägnanteren Weg, um die Schnittmenge von zwei Listen in C# zu erhalten?

In C# eine Methode zur Berechnung einer Schnittmenge von Liste von Daten ist:

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

In Ruby würde man dies wie folgt tun:

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

Die Hauptursache für diese Schwerfälligkeit ist die Asymmetrie zwischen IEnumerable und konkreten Containern und Arrays.

Ich bin immer wieder erstaunt, wie schlecht die C#-Standardbibliotheken konzipiert sind, da diese Art von Problemen immer wieder auftaucht.

Gibt es eine bessere, d.h. elegantere und prägnantere Möglichkeit, dies zu tun?

19voto

dtb Punkte 205441

Sie können die Enumerable.Intersect y Enumerable.ToList Erweiterungsmethoden wie folgt, um einen sehr eleganten und prägnanten Code zu erhalten:

public List<DateTime> dates_common(Timeserie ts1, Timeserie ts2)
{
    return ts1.dates.Intersect(ts2.dates).ToList();
}

1voto

Amrit Jain Punkte 89
    // 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);
        }
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X