按自定义列表分组linq c#

时间:2014-09-02 07:39:13

标签: c# linq

我在了解自定义组和订购时遇到问题。这是方案,

我有一个包含数据的对象。

Objects(对象)>对象 - >名称; (对象的结构)

我希望按照自定义列表进行分组(名称是分组的关键对象)。

name就像a,b,c,我想要b,c,a(样本)。

这是我的工作

IOrderedEnumerable<IGrouping<string, Snit>> assetGrouping = sUnits.ToArray().GroupBy(e => e.Name).OrderBy(e => e.Key);

我希望按自定义列表进行分组和排序

List<string > customOrder=new List<string>();
            customOrder.Add("any");
customOrder.Add("some");

任何人都可以帮助我..

1 个答案:

答案 0 :(得分:1)

这是我使用LINQPad取消的内容:

先决条件:

public class Data
{
    public string Name {get; set;}
}

var keys = new[]{"1", "15", "13", "16"};

var random = new Random();

var data = Enumerable.Range(1, 100)
    .Select( _ => new Data
    {
        Name = random.Next(24).ToString()
    });

var keys = new[]{"1", "15", "13", "16"};

现在,分组:

var grouped = data.GroupBy(x => keys.FirstOrDefault(k=>k==x.Name));

上面的查询会将data中的项目分组如下:对于x中的每个值data,如果k中有一个键keys使用k == x.Name,该值将添加到具有键k的单独组中;所有其他值将添加到具有键null;

的单独组中

对于组的排序,您只需要使用keys数组中每个组键的位置。

var ordered = grouped.OrderBy( g =>
{
    var index = Array.IndexOf(keys, g.Key);
    return index == -1 ? int.MaxValue : index;
});
如果在字典中找不到该项,

Array.IndexOf将返回-1。在这种情况下,根据您的需要,项目必须位于集合的末尾,因此返回最大值。否则,只需使用密钥的索引。

结果如下图所示: Query results.