2017-02-10 4 views
4

Ich dachte, das wäre einfach gewesen, aber leider kann ich keine Antwort auf das finden, wonach ich suche. Was ich gerne erreichen würde, ist eine Liste mit eindeutigen Ergebnissen, wenn sie dupliziert werden, andernfalls 0 anstelle von einzelnen Elementen zurückgeben. Der Code Ich habe so weit ist, wo die erste deutliche durch sollten alle unterschiedlichen Zeilen zurück, und dann die zweite man sie weiter nach unten filtern:Rückgabe 0, wenn keine Duplikate gefunden wurden von DistinctBy

List<Server> serversWithBothAffinity = filteredServers 
    .DistinctBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot, x.ServerAffinity}) 
    .DistinctBy(x => new {x.ServerVersion, x.ServerName, x.ServerSlot}); 

Das Problem dabei ist, wenn ich nur 1 Punkt haben in die folgende Liste, die keine Duplikate hat - noch in diesem Code gibt 1, wenn ich es 0.

Happy day Szenario zurückkehren wollen, wenn seine alle arbeiten, wie ich will, da der folgende:

{1.0, "ServerName1", "ServerSlotA", "Europe"} 
{1.0, "ServerName1", "ServerSlotA", "Pacific"} 
{1.0, "ServerName2", "ServerSlotB", "Europe"} 
{1.0, "ServerName2", "ServerSlotA", "Pacific"} 

Ergebnis ist korrekt wie erwartet:

{1.0, "ServerName1", "ServerSlotA"} 

Problem Szenario gegeben wie folgt zusammen:

{1.0, "ServerName1", "ServerSlotA", "Europe"} 

Ergebnis ist falsch:

{1.0, "ServerName1", "ServerSlotA"} 

Erwartetes Ergebnis: nichts

Bitte helfen.

Antwort

3

Sie brauchen nicht MoreLINQ hier:

List<Server> serversWithBothAffinity = filteredServers 
    .GroupBy(x => new { x.ServerVersion, x.ServerName, x.ServerSlot}) 
    .Where(g => 1 < g.Count()) 
    .Select(g => g.First()) 
    .ToList(); 

Das Problem mit DistinctBy ist, dass es nach der Anwendung kann Ihnen nicht sagen, wie viele Elemente in jeder ‚Gruppe‘ war - wird es einen Artikel produzieren


Sie können auch schöne Abfragesyntax (na ja, außer ToList Teil) verwenden

var serversWithBothAffinity = 
     from s in filteredServers 
     group s by new { s.ServerVersion, s.ServerName, s.ServerSlot} into g 
     where 1 < g.Count() 
     select g.First(); 
+1

ich mochte die Einfachheit. Dies sieht aus wie "Gruppe von" + "Haben" in SQL-Server. – Alisson

+1

Danke, es macht mehr Sinn so –

Verwandte Themen