views:

465

answers:

2

I've created some sample code below, and am trying to use a lambda expression to query against the SoftwareComponents Dictionary. The problem is that the query returns a var of type IGrouping, when what I need to do is further refine the query so that it returns a type of IGrouping where the first string is the SoftwareComponent.ComponentName, and the second string is the SoftwareComponent.ComponentDescription. Anyone know how to do this?

I was hoping the data returned would look something like: "New Type Description" "component1" "component2" "Old Type Description" "component3" "component4"

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;
    }
}
+3  A: 

Try this:

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

Given the sample data you provided, grouping by ComponentName is not going to result in any useful groups. I am not sure if your data actually has a unique name for each component, but if there are, then grouping won't actually provide any value.

To actually achieve the grouping you need, however, you can do the following:

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);

That should result in an enumeration of components with the ComponentName and Description. Note that the only way to retrieve values from a group is to either select the first or last entry, or perform an aggregate sum, avg, etc. The only directly selectable value is the key (which may be composite, and therefor have multiple values.)

jrista
Now after re-reading the question, your answer is closer to what he wants then mine.
epitka