我在了解自定义组和订购时遇到问题。这是方案,
我有一个包含数据的对象。
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");
任何人都可以帮助我..
答案 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
。在这种情况下,根据您的需要,项目必须位于集合的末尾,因此返回最大值。否则,只需使用密钥的索引。
结果如下图所示: