5

我很难针对通用列表 myList 创建工作组依据和排序依据子句。myList 有一个属性“设置”列表,它本身包含每个业务的“子”属性列表。

我想按行业分组,并在每个行业内按企业名称排序。我的意图是这样的:

string groupSetting = "Industry";
sortSetting = "BusinessName";
myList.GroupBy(p => p.Settings.Find(s => s.Name == groupSetting)).OrderBy(p => p.Settings.Find(t => t.Name == sortSetting));

但是我收到错误消息:' System.Linq.IGrouping 不包含设置的定义,并且没有扩展方法设置接受 System.Linq.Igrouping 类型的第一个参数可以找到.... '表明我无法调用订单by 子句没有一些转换或额外的处理。

我已经尝试了各种各样的方法来分解它并让它工作,但我错过了一些东西。任何帮助表示赞赏

4

1 回答 1

13

您的问题是它GroupBy不会返回单个设置列表,而是返回“列表列表”。这就是IGrouping你所看到的。

您需要遍历 中的每个组,IGrouping对该组进行排序,然后遍历该组中的每个项目。观察:

public static void Main( string[] args )
{
    var groupSetting = "Industry";

    // step 1: group the data. Note this doesn't actually create copies of the data as
    // it's all lazy loaded
    // BEWARE. If a company doesn't have the "Industry" setting, this will throw an exception
    var grouped = companies.GroupBy(c => c.Settings.First(s => s.Name == groupSetting).Value);
    foreach( var group in grouped )
    {
        Console.WriteLine(group.Key);// this is the Value that came out of the GroupBy

        // Note how we have to do the ordering within each individual group. 
        // It doesn't make sense to try group them in one hit like in your question
        foreach( var item in group.OrderBy(bus => bus.Name) )
            Console.WriteLine(" - " + item.Name);
    }
}

为清楚起见提供的数据结构:

struct Setting { public string Name; public string Value; }
struct Business { public string Name; public IEnumerable<Setting> Settings; }

static IEnumerable<Business> companies = new[]{
    new Business{ Name = "XYZ Inc.", Settings = new[]{ 
        new Setting{ Name="Age", Value="27"},
        new Setting{ Name="Industry", Value="IT"}
    }},
    new Business{ Name = "Programmers++", Settings = new[]{ 
        new Setting{ Name="Age", Value="27"},
        new Setting{ Name="Industry", Value="IT"}
    }},
    new Business{ Name = "Jeff's Luxury Salmon", Settings = new[]{ 
        new Setting{ Name="Age", Value="63"},
        new Setting{ Name="Industry", Value="Sports"}
    }},
    new Business{ Name = "Bank of Khazakstan", Settings = new[]{ 
        new Setting{ Name="Age", Value="30"},
        new Setting{ Name="Industry", Value="Finance"}
    }},
};

这将产生以下输出:复制/粘贴代码并运行它并使用它

IT
 - Programmers++
 - XYZ Inc.
Sports
 - Jeff's Luxury Salmon
Finance
 - Bank of Khazakstan
于 2009-05-19T04:25:41.393 回答