2009-06-18 4 views
1

Ich habe einige Beispielcode unten erstellt und versuche, einen Lambda-Ausdruck zu verwenden, um das SoftwareComponents Dictionary abzufragen. Das Problem ist, dass die Abfrage eine var vom Typ IGrouping zurückgibt, wenn ich die Abfrage weiter verfeinere, sodass sie einen Typ von IGrouping zurückgibt, wobei die erste Zeichenfolge SoftwareComponent.ComponentName und die zweite Zeichenfolge die SoftwareComponent ist. Komponentenbeschreibung. Weiß jemand, wie man das macht?Abfrage eines Dictionary mit einem Lambda-Ausdruck

ich die Daten hatte gehofft, wieder etwas aussehen würde: "Neuer Typ Beschreibung" "Teil1" "komponente2" "Old Typ Beschreibung" "component3" "Komponente4"

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class _Default : System.Web.UI.Page 
{ 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     UnOwnedSoftware software = new UnOwnedSoftware(); 

     var components = software.SoftwareComponents.Values. 
      GroupBy(s => s.ComponentName); 
    } 
} 

public class UnOwnedSoftware 
{ 
    public Dictionary<int, SoftwareComponent> SoftwareComponents 
     = new Dictionary<int, SoftwareComponent>(); 

    public UnOwnedSoftware() 
    { 
     SoftwareComponent component1 = new SoftwareComponent 
      ("component1", 1, "New Type Description"); 
     SoftwareComponent component2 = new SoftwareComponent 
      ("component2", 2, "New Type Description"); 
     SoftwareComponent component3 = new SoftwareComponent 
      ("component3", 3, "Old Type Description"); 
     SoftwareComponent component4 = new SoftwareComponent 
      ("component4", 4, "Old Type Description"); 

     SoftwareComponents.Add(1, component1); 
     SoftwareComponents.Add(2, component2); 
     SoftwareComponents.Add(3, component3); 
     SoftwareComponents.Add(4, component4); 
    } 
} 

public class SoftwareComponent 
{ 
    public string ComponentName { get; set; } 
    public int ID { get; set; } 
    public string ComponentDescription { get; set; } 

    public SoftwareComponent(string componentName, int id, string componentDescription) 
    { 
     ComponentName = componentName; 
     ID = id; 
     ComponentDescription = componentDescription; 
    } 
} 
+0

Können Sie ein Beispiel dafür angeben, wie die Ergebnisse aussehen sollen? – LukeH

+0

OK, ich habe ein Beispiel hinzugefügt. –

Antwort

3

Versuchen Sie Folgendes:

var components = (from s in software.SoftwareComponents.Values 
        select new 
        { 
         Name = s.ComponentName, 
         Description = s.ComponentDescription 
        }) 
       .ToList().GroupBy(s=>s.Name); 
1

Angesichts der Beispieldaten, die Sie angegeben haben, wird die Gruppierung nach ComponentName keine Ergebnisse ergeben nützliche Gruppen. Ich bin mir nicht sicher, ob Ihre Daten tatsächlich einen eindeutigen Namen für jede Komponente haben, aber wenn dies der Fall ist, liefert die Gruppierung keinen Wert.

Um das zu erreichen tatsächlich die Gruppierung die Sie benötigen, können Sie jedoch Folgendes tun:

var components = from v in software.SoftwareComponents.Values 
       group v by v.name into g 
       select new { ComponentName = g.Key, Description = g.First(v => v.Description); 

, die in einer Aufzählung von Komponenten mit dem Component und Beschreibung führen sollen. Beachten Sie, dass die einzige Möglichkeit zum Abrufen von Werten aus einer Gruppe entweder die Auswahl des ersten oder des letzten Eintrags oder die Aggregation von Summe, Durchschnitt usw. ist. Der direkt auswählbare Wert ist der Schlüssel (der zusammengesetzt sein kann und daher mehrere Werte hat) .)

+0

Jetzt, nachdem Sie die Frage erneut gelesen haben, ist Ihre Antwort näher an dem, was er möchte, als an meinem. – epitka

Verwandte Themen