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