C# 列表基于另一个列表排序
我有两个通用列表对象,其中一个包含id和排序,另一个是一组id,第二个列表中的每个id都有对第一个列表的id引用C# 列表基于另一个列表排序,c#,linq,sorting,C#,Linq,Sorting,我有两个通用列表对象,其中一个包含id和排序,另一个是一组id,第二个列表中的每个id都有对第一个列表的id引用 public class OptionType { public int ID { get; set; } public int Ordering { get; set; } } public class Option { public int ID { get; set; } public int Type_ID { get; set; } }
public class OptionType
{
public int ID { get; set; }
public int Ordering { get; set; }
}
public class Option
{
public int ID { get; set; }
public int Type_ID { get; set; }
}
显然,我可以通过
types_list.OrderBy(x => x.Ordering);
问题是,我如何利用对象上与类型列表排序相关的“类型ID”来对“选项列表”进行排序。就像这样(显然这是无效的,但希望你能明白!)
您应该能够使用联接生成所需的输出。使用查询语法的示例
var orderedOptions = from option in options_list
join type in types_list
on option.Type_ID equals type.ID
orderby type.Ordering
select option;
我喜欢Lambda语法,所以我提出了这个等价物。我可以看出查询语法对于连接来说是多么的简洁
var orderedOptions = options_list
.Join(
types_list,
option => option.Type_ID,
type => type.ID,
(option, type) => new { Option = option, Type = type })
.OrderBy(x => x.Type.Ordering)
.Select(x => x.Option);
为了稍微减少(我不确定是什么),这将创建一个新对象,它只包含Ordering属性,而不是整个类型类。这里没有什么不同,但我有一个包含排序数据的大型类,只需要sorting属性。不知道这是否重要,但读起来更清楚
var orderedOptions = options_list
.Join(
types_list,
option => option.Type_ID,
type => type.ID,
(option, type) => new { Option = option, Ordering = type.Ordering })
.OrderBy(x => x.Ordering)
.Select(x => x.Option);
看起来查询语法允许您在初始查询中排序,而lambda需要在连接创建新对象后排序。也许他们真的在幕后做着同样的事情:创建连接的对象,然后进行排序和选择。在处理小列表时是你的朋友:
var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id));
工作示例:
正如@goodeye在评论中指出的,在更大的列表中,性能将是一场噩梦。在这种情况下使用。我不明白,您能给我们一个示例,说明在给定一些输入的情况下,排序后的输出可能是什么样子吗?这比连接简单得多。这假设listA已经按照所需的顺序(type.Ordering)排序。也就是说,它使用listA在列表中的位置,而不是listA的属性。它也在执行multple FindIndex,因此在大型列表上可能会有性能问题。伙计,你真的帮了我一把。当我使用此方法时,我得到了
传入请求有太多参数错误,我该怎么办?搞定了。干杯我在找类似的东西。通常会忘记这种类型的linq语法:-/
var orderedB = listB.OrderBy(b => listA.FindIndex(a => a.id == b.id));