2

定義済みの uniqueIds に基づいて従業員リストを並べ替える必要があります。

簡単に言えば、従業員IDのリストを考えてみましょう1 to 10 in random order.

従業員オブジェクトを注文するという定義済みのルールがあります。2, 8, 1, 4, 6従業員 UId が範囲 [1,10] にない場合は、リストの最後に配置します... (任意の順序)。

を使用して次のコードを書きIComparer<Employee>ました。

public class Employee
    {
        public int UId { get; set; }
        public string Name { get; set; }        
    }

    class Comparision : IComparer<Employee>
    {
        List<int> referenceKeys = new List<int> { 2, 8, 1, 4, 6 };
        public int Compare(Employee thisOne, Employee otherOne)
        {
            var otherIndex = referenceKeys.IndexOf(otherOne.UId);
            var thisIndex = referenceKeys.IndexOf(thisOne.UId);
            if (thisIndex > otherIndex)
            {
                return 1;
            }
            else if (thisIndex < otherIndex)
            {
                return -1;
            }
            else
            {
                //if uid not found in reference list treat both employee obj as equal
                return 0;
            }
        }
    }
    class CustomSorting
    {
        public static 
        List<Employee> employees = new List<Employee>
        {
            new Employee{UId=1, Name="Ram"},
            new Employee{UId=2 , Name="Shyam"},
            new Employee{UId=3 , Name="Krishna"},
            new Employee{UId=4 , Name="Gopal"},
            new Employee{UId=5 , Name="Yadav"},
            new Employee{UId=6 , Name="Vishnu"},
            new Employee{UId=7 , Name="Hari"},
            new Employee{UId=8 , Name="Kanha"},
        };

        void sort()
        {
            employees.Sort(new Comparision());
        }

        static void Main()
        {
            new CustomSorting().sort();
        }
    }

次の結果で、リストを並べ替えることができました-

(5, 7, 3), 2, 8, 1, 4, 6==> 5、7、3 は参照キーに記載されていないため、任意の順序で最後に表示する必要があります..

ただし、参照キーにないアイテムは最初にソートされます。それらを最後に置く必要があります。

そのようなシナリオの場合IComparer、最善の方法は ですか?

4

1 に答える 1

4

var otherIndex = referenceKeys.IndexOf(otherOne.UId);アイテムが見つからない場合に返さ-1れ、見つかった値よりも小さくなります。

見つからないすべてのアイテムを、見つかった値よりも大きくしたいので、以下を追加するだけです:

if(otherIndex == -1) otherIndex = int.MaxValue;
if(thisIndex == -1) thisIndex = int.MaxValue;

余談ですが、以下を使用するだけで、メソッドの残りの部分を簡素化できます。

return thisIndex.CompareTo(otherIndex);
于 2012-11-30T16:14:36.017 に答える