Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 列表基于另一个列表排序_C#_Linq_Sorting - Fatal编程技术网

C# 列表基于另一个列表排序

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; } }

我有两个通用列表对象,其中一个包含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; }
}   
显然,我可以通过

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));