it-swarm.com.de

Linq zum neuen Objekt auswählen

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

26
Jeff

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());   
33
Pranay Rana

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.

25
Jon Skeet

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();
19
dckuehn
var x = from t in types
        group t by t.Type into grouped
        select new { type = grouped.Key,
                     count = grouped.Count() };
3
daryal

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)]);
1
Steve

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.

0