0

我有一个List<Project>

一个项目的 ID 是一个 int。然后我有一个对应于项目 ID 的 int 列表。

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

可能存在 ID 为空的项目。

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

我可以想到一种 O(N^2) 方法来做到这一点,但我想知道是否有更好的方法使用 LINQ 或者可能更多的 m + n 或 n 或其他东西......

谢谢

4

4 回答 4

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 推到最后并从最小到最大排序。

或者,如果您根本不想处理 nan 并且不想按 ID 排序,只需使用 where 语句来获取没有空 id 的迭代器:

var nonulls = pros.Where(pr => (pr.id != null));

懒惰地评估为没有空值的集合,实际上并不存储中间体,因此您不必担心存储问题。O(N),几乎没有开销。

于 2013-04-09T18:46:27.367 回答
0

在下一个解决方案中,带有 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]);
于 2013-04-09T18:32:55.437 回答
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);
于 2013-04-09T18:51:04.993 回答
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;
    }
}

希望这可以帮助!

于 2013-04-10T00:48:11.927 回答