我有List<Project>
项目的ID为int。 然后我有一个int列表,它对应于项目的ID。
项目需要按照int。列表的顺序进行处理。
可能存在具有空ID的项目。
任何没有ID或ID不在列表中的项目都会到底(或者更好,从结果列表中删除)。
我可以想到一种O(N ^ 2)方法来做这个但我想知道是否有更好的方法可以使用LINQ或更多m + n或n或者其他东西......
由于
答案 0 :(得分:1)
class Project
{
public int? id;
public Project(int? iid) { id = iid; }
}
public class Program
{
static void Main(string[] args)
{
List<Project> pros = new List<Project>() { new Project(null), new Project(10), new Project(50), new Project(1), new Project(null) };
var x = new Comparison<Project>((Project r, Project l) =>
{
if (r.id == null && l.id == null)
return 0;
if (r.id == null)
{
return 1;
}
if (l.id == null)
{
return -1;
}
return Math.Sign(r.id.Value - l.id.Value);
});
pros.Sort(x);
Console.ReadLine();
}
}
你可以改变谁和极性-1或1的极限来获得你希望它去的nans。这个推动nans到最后并且从最小到最大排序。
或者,如果您根本不想处理nans并且不想按ID排序,只需使用where语句来获取没有null id的迭代器:
var nonulls = pros.Where(pr => (pr.id != null));
懒惰地评估为没有空值的集合,实际上并不存储中间体,因此您不必担心存储问题。 O(N),几乎没有开销。
答案 1 :(得分:0)
下一个具有null Id
的解决方案项目将被忽略。的 O(N)强>
int[] ids = new int[10];
List<Project> projects = new List<Project>();
var projectsDictionary = projects.ToDictionary(proj=> proj.Id, proj => proj);
var orderedProjects = ids.Select(id => projectsDictionary[id]);
答案 2 :(得分:0)
使用自定义比较以任何方式处理空项目编号:
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);
答案 3 :(得分:0)
这是一种非常简单的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>();
假设您的Project类如下所示:
class Project
{
public int? ID;
public Project(int? id)
{
ID = id;
}
}
希望这有帮助!