0

私はList<Project>

プロジェクトには、int である ID があります。次に、プロジェクトの ID に対応する int のリストがあります。

プロジェクトは、int のリストの順序で処理する必要があります。

null 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 に変更して、目的のナンを取得できます。これはナンを最後までプッシュし、最小から最大にソートします。

または、nan をまったく処理したくない場合や、ID でソートしたくない場合は、where ステートメントを使用して、null ID なしで反復子を取得します。

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

これは、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

これは非常に単純な 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 に答える
0

カスタム比較を使用して、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);
于 2013-04-09T18:51:04.993 に答える