14 Stimmen

Abfrage einer Liste von Listen von Elementen in LINQ c#

Ich bin ein bisschen neu zu LINQ, hier ist mein Problem.

  • Ich habe eine Liste von Listen von Artikeln
  • Ich möchte die Artikel erhalten, die in nur einer Liste vorhanden sind (und wenn ich die Liste, in der sie sind, ohne durch die "Liste der Liste" wiederholen Liste" zu erhalten, wäre das großartig).

Ich versuche erfolglos, die Schlüsselwörter Aggregate / Except / Group in der Linq-Abfrage zu verwenden, aber bis jetzt habe ich noch keine Lösung gefunden.

[EDIT] Könnte zum Beispiel sein List<List<int>> und die Bedingung, dass der Wert von int nicht in den anderen Listen enthalten ist.

Um ehrlich zu sein, wenn ich es mit mehreren foreach Es gelingt mir, die Wertelemente zu finden, aber da ich versuche, LINQ zu lernen, würde ich gerne wissen, welche Art von Abfrage ich schreiben sollte, um die Ergebnisse zu erhalten

zum Beispiel

 1,2,6
 1,6
 3,5
 5,10
 3,10,6

gibt 2 zurück und die erste Liste

16voto

Roger Johansson Punkte 21831
var query = from list in lists
            from value in list
            where lists.Where(l => l.Contains(value)).Any()
            select new { List = list, Value = value };

2voto

John Rasch Punkte 60054

So erhalten Sie die eindeutigen Ganzzahlen:

var ints = listOfLists.SelectMany(l => l);
var uniques = ints.Where(i => ints.Count(val => val == i) == 1);

2voto

Thomas Levesque Punkte 277723
from lst in lists
from i in lst
group lst by i into grp
where grp.Count() == 1
select new { Value = grp.Key, List = grp.Single() };

So erhalten Sie die Nummern, die nur in einer Liste erscheinen, zusammen mit der Liste, die sie enthält

EDIT: ein wenig vereinfacht

1voto

Matthew Whited Punkte 21770
var sets = new[] { "1,2,6", "1,6", "3,5,9", "5,10", "3,10,6" };

var grouped = sets.SelectMany(i => i.Split(','))
                  .GroupBy(i => i)
                  .Where(i => i.Count() == 1)
                  .Select(i => i.Key);

Console.WriteLine(string.Join(", ", grouped.ToArray())); //2, 9

0voto

tzaman Punkte 44506

Sieht so aus, als hätte ich die gleiche Lösung wie Thomas gefunden, nur mit der funktionalen Syntax...

var uniques = listlist.SelectMany(l => l.Select(i => new {Item = i, Origin = l}))
                      .GroupBy(i => i.Item)
                      .Where(g => g.Count() == 1)
                      .Select(g => g.First());

Beachten Sie, dass alle unsere Lösungen davon ausgehen, dass die Zahlen innerhalb Wenn also eine einzelne Liste einen sich wiederholenden Wert enthält, der in keiner der anderen Listen vorkommt, wird er trotzdem abgelehnt.

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