我有一个List<Project>
一个项目的 ID 是一个 int。然后我有一个对应于项目 ID 的 int 列表。
项目需要按照 int 列表的顺序进行处理。
可能存在 ID 为空的项目。
任何没有 ID 或 ID 不在列表中的项目都将移至底部(或者甚至更好,从结果列表中删除)。
我可以想到一种 O(N^2) 方法来做到这一点,但我想知道是否有更好的方法使用 LINQ 或者可能更多的 m + n 或 n 或其他东西......
谢谢
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 推到最后并从最小到最大排序。
或者,如果您根本不想处理 nan 并且不想按 ID 排序,只需使用 where 语句来获取没有空 id 的迭代器:
var nonulls = pros.Where(pr => (pr.id != null));
懒惰地评估为没有空值的集合,实际上并不存储中间体,因此您不必担心存储问题。O(N),几乎没有开销。
在下一个解决方案中,带有 null 的项目Id
将被忽略。在)
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]);
使用自定义比较以您喜欢的任何方式处理空项目编号:
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);
这是一个非常简单的 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;
}
}
希望这可以帮助!