Запрос словаря с лямбда-выражением - PullRequest
1 голос
/ 18 июня 2009

Ниже я создал пример кода и пытаюсь использовать лямбда-выражение для запроса к словарю SoftwareComponents. Проблема в том, что запрос возвращает переменную типа IGrouping, когда мне нужно дополнительно уточнить запрос, чтобы он возвращал тип IGrouping, где первая строка - это SoftwareComponent.ComponentName, а вторая - это SoftwareComponent. ComponentDescription. Кто-нибудь знает, как это сделать?

Я надеялся, что возвращаемые данные будут выглядеть примерно так: «Описание нового типа» "Component1" "Component2" «Описание старого типа» "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;
    }
}

Ответы [ 2 ]

3 голосов
/ 18 июня 2009

Попробуйте это:

var components = (from s in software.SoftwareComponents.Values
                  select new
                  {
                      Name = s.ComponentName,
                      Description = s.ComponentDescription
                  })
                 .ToList().GroupBy(s=>s.Name);
1 голос
/ 18 июня 2009

Учитывая предоставленные вами примеры данных, группировка по ComponentName не приведет к созданию каких-либо полезных групп. Я не уверен, что на самом деле ваши данные имеют уникальное имя для каждого компонента, но если они есть, тогда группировка не даст никакого значения.

Однако для того, чтобы действительно получить нужную вам группировку, вы можете сделать следующее:

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

Это должно привести к перечислению компонентов с ComponentName и Description. Обратите внимание, что единственный способ извлечь значения из группы - это выбрать первую или последнюю запись или выполнить агрегированную сумму, среднюю и т. Д. Единственное значение, которое можно выбрать напрямую - это ключ (который может быть составным и поэтому иметь несколько значений .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...