2014-09-02 30 views
-1

我有问题了解自定义组,并按顺序排列。这里是场景,按自定义列表组linq c#

我有一个对象包含数据。

Objects-> object-> 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"); 

任何机构可以帮助我..

+0

如果有这将不包含在您的自定义顺序列表中的名称? – mbudnik 2014-09-02 07:45:48

+0

@MBudnik然后它会被移动到最后。我只想列出的项目将是第一个,其他人将是最后一个。 – 2014-09-02 07:56:00

回答

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的项目如下:为每个值xdata,如果在keys关键kk == 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.