给出一个键列表的排序列表?

时间:2013-04-09 18:26:14

标签: c# asp.net linq

我有List<Project>

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

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

可能存在具有空ID的项目。

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

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

由于

4 个答案:

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

希望这有帮助!