Ich habe eine linq-Abfrage
var x = (from t in types select t).GroupBy(g =>g.Type)
welche Objekte nach ihrem Typ gruppiert werden, als Ergebnis möchte ich ein einzelnes neues Objekt, das alle gruppierten Objekte und deren Anzahl enthält. Etwas wie das:
type1, 30
type2, 43
type3, 72
um es klarer zu sagen: Gruppierungsergebnisse sollten in einem Objekt und nicht in einem Objekt pro Elementtyp enthalten sein
Lesen Sie: 101 LINQ-Beispiele in LINQ - Gruppierungsoperatoren von Microsoft MSDN-Site
var x = from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() };
forsingle object verwendet stringbuilder und hängt es an, um dies in Form eines Wörterbuchs auszuführen oder zu konvertieren
// fordictionary
var x = (from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() })
.ToDictionary( t => t.type, t => t.count);
//for stringbuilder not sure for this
var x = from t in types group t by t.Type
into grp
select new { type = grp.key, count = grp.Count() };
StringBuilder MyStringBuilder = new StringBuilder();
foreach (var res in x)
{
//: is separator between to object
MyStringBuilder.Append(result.Type +" , "+ result.Count + " : ");
}
Console.WriteLine(MyStringBuilder.ToString());
Alle gruppierten Objekte oder alle Typen ? Es klingt wie Sie vielleicht wollen:
var query = types.GroupBy(t => t.Type)
.Select(g => new { Type = g.Key, Count = g.Count() });
foreach (var result in query)
{
Console.WriteLine("{0}, {1}", result.Type, result.Count);
}
BEARBEITEN: Wenn Sie wollen es in einem Wörterbuch, können Sie einfach Folgendes verwenden:
var query = types.GroupBy(t => t.Type)
.ToDictionary(g => g.Key, g => g.Count());
Sie müssen nicht in Paaren auswählen und dann das Wörterbuch erstellen.
Die Antworten hier haben mich näher gebracht, aber 2016 konnte ich folgendes LINQ schreiben:
List<ObjectType> objectList = similarTypeList.Select(o =>
new ObjectType
{
PropertyOne = o.PropertyOne,
PropertyTwo = o.PropertyTwo,
PropertyThree = o.PropertyThree
}).ToList();
var x = from t in types
group t by t.Type into grouped
select new { type = grouped.Key,
count = grouped.Count() };
Wenn Sie nach jedem Typ suchen möchten, um seine Häufigkeit zu ermitteln, müssen Sie die Aufzählung in ein Wörterbuch umwandeln.
var types = new[] {typeof(string), typeof(string), typeof(int)};
var x = types
.GroupBy(type => type)
.ToDictionary(g => g.Key, g => g.Count());
foreach (var kvp in x) {
Console.WriteLine("Type {0}, Count {1}", kvp.Key, kvp.Value);
}
Console.WriteLine("string has a count of {0}", x[typeof(string)]);
Dies ist ein hervorragender Artikel für die Syntax, die zum Erstellen neuer Objekte aus einer LINQ-Abfrage benötigt wird.
Wenn die Zuweisungen zum Ausfüllen der Felder des Objekts jedoch mehr sind als einfache Zuweisungen, z. B. das Analysieren von Zeichenfolgen in Ganzzahlen, und eine davon schlägt fehl, ist ein Debugging nicht möglich. Sie können keinen Haltepunkt für die einzelnen Zuweisungen erstellen.
Wenn Sie alle Zuweisungen in eine Subroutine verschieben und ein neues Objekt von dort zurückgeben und versuchen, einen Haltepunkt in dieser Routine festzulegen, können Sie in dieser Routine einen Haltepunkt setzen. Der Haltepunkt wird jedoch niemals ausgelöst.
Also statt:
var query2 = from c in doc.Descendants("SuggestionItem")
select new SuggestionItem
{ Phrase = c.Element("Phrase").Value
Blocked = bool.Parse(c.Element("Blocked").Value),
SeenCount = int.Parse(c.Element("SeenCount").Value)
};
Oder
var query2 = from c in doc.Descendants("SuggestionItem")
select new SuggestionItem(c);
Ich habe stattdessen das gemacht:
List<SuggestionItem> retList = new List<SuggestionItem>();
var query = from c in doc.Descendants("SuggestionItem") select c;
foreach (XElement item in query)
{
SuggestionItem anItem = new SuggestionItem(item);
retList.Add(anItem);
}
So konnte ich problemlos debuggen und herausfinden, welche Zuordnung fehlschlug. In diesem Fall fehlte dem XElement ein Feld, das ich im SuggestionItem gesetzt hatte.
Ich bin mit Visual Studio 2017 auf diese Problemstriche gestoßen, während ich Unit-Tests für eine neue Bibliotheksroutine schrieb.