C# 排序列表是否给出了一个键列表?

C# 排序列表是否给出了一个键列表?,c#,asp.net,linq,C#,Asp.net,Linq,我有一个列表 项目的ID为int。 然后我有一个int列表,它对应于项目的id 项目需要按照int列表的顺序进行处理 可能存在ID为空的项目 任何没有ID或ID不在列表中的项目都将位于底部(或者更好,从结果列表中删除) 我可以想出一个O(N^2)的方法来实现这一点,但我想知道是否有更好的方法使用LINQ或其他更m+N或N或其他的方法 感谢使用下一个解决方案,Id为null的项目将被忽略O(N) int[]ids=newint[10]; 列表项目=新列表(); var projectsDictio

我有一个
列表

项目的ID为int。 然后我有一个int列表,它对应于项目的id

项目需要按照int列表的顺序进行处理

可能存在ID为空的项目

任何没有ID或ID不在列表中的项目都将位于底部(或者更好,从结果列表中删除)

我可以想出一个O(N^2)的方法来实现这一点,但我想知道是否有更好的方法使用LINQ或其他更m+N或N或其他的方法


感谢使用下一个解决方案,Id为null的项目将被忽略O(N)

int[]ids=newint[10];
列表项目=新列表();
var projectsDictionary=projects.ToDictionary(proj=>proj.Id,proj=>proj);
var orderedProjects=id.Select(id=>projectsDictionary[id]);

它惰性地计算为不带null的集合,实际上不存储中间产物,因此您不必担心存储问题。O(N),几乎没有开销。

使用自定义比较以任意方式处理空项目编号:

class Project {
    int? ID { get; set; }
}
...
Comparison<Project> comparison = delegate(Project x, Project y)
{
    int xkey = x.ID.HasValue ? x.ID.Value : int.MaxValue;
    int ykey = y.ID.HasValue ? y.ID.Value : int.MaxValue;
    return xkey.CompareTo(ykey);
};
list.Sort(comparison);
类项目{
int?ID{get;set;}
}
...
比较=委托(项目x、项目y)
{
int xkey=x.ID.HasValue?x.ID.Value:int.MaxValue;
int-ykey=y.ID.HasValue?y.ID.Value:int.MaxValue;
返回xkey.CompareTo(ykey);
};
列表、排序(比较);

这里有一个非常简单的LINQ方法。但不确定运行时

List<int?> pids = new List<int?>() { 2, 4, 3 };

List<Project> projects = new List<Project>() { 
    new Project(1), new Project(2), 
    new Project(3), new Project(4), 
    new Project(5), new Project(null) };

List<Project> sortedProjectsByPids = pids
    .Select(pid => projects.First(p => p.ID == pid))
    .ToList<Project>();

希望这有帮助

将在平均O(n*log(n)),最坏情况O(n^2)中完成,并且您不必写任何东西。您可以用一个最小的示例将其放在回答形式中吗?如何处理具有null
id
?哈希排序将在O(n*log(n))时间内以正确的顺序获得对象,但我认为您必须使用类型来保证键的排序。@MadScienceDreams在字典中的顺序并不重要<代码>ID数组指示order@Ivanov啊哈,误读了OP的评论,你是对的。在这种情况下,一个“where”语句会更好…我会改变我的答案。很好,但是如果他们有一个键是maxvalue,它并不保证在null id之前:
List pros=new List(){new Project(null),new Project(int.maxvalue),new Project(50),new Project(1),new Project(null)}变为{1,50,null,int.MaxValue,null}。当然,这是一个极端的情况。
var nonulls = pros.Where(pr => (pr.id != null));
class Project {
    int? ID { get; set; }
}
...
Comparison<Project> comparison = delegate(Project x, Project y)
{
    int xkey = x.ID.HasValue ? x.ID.Value : int.MaxValue;
    int ykey = y.ID.HasValue ? y.ID.Value : int.MaxValue;
    return xkey.CompareTo(ykey);
};
list.Sort(comparison);
List<int?> pids = new List<int?>() { 2, 4, 3 };

List<Project> projects = new List<Project>() { 
    new Project(1), new Project(2), 
    new Project(3), new Project(4), 
    new Project(5), new Project(null) };

List<Project> sortedProjectsByPids = pids
    .Select(pid => projects.First(p => p.ID == pid))
    .ToList<Project>();
class Project
{
    public int? ID;

    public Project(int? id)
    {
        ID = id;
    }
}