3

Office がクラスであるため、エントリをList<Office>国別に並べ替える必要があります (国は Office クラスのプロパティです)。

一部のオフィスには国が設定されていないため、リストの上部に表示されます。この場合、「関連性が低い」と見なされるため、それらをリストの一番下に配置する必要があります。

switch (sortOptions.SortField)

...  

case OfficeSortField.Country:

var noCountryList = officesList.Where(a => string.IsNullOrEmpty(a.CountryText)).ToList();
officesList.RemoveAll(a => string.IsNullOrEmpty(a.CountryText));

officesList= sortOptions.SortOrder == SortOrder.Ascending
                                      ? officesList.OrderBy(o => o.CountryText).ToList()
                                      : officesList.OrderByDescending(o => o.CountryText).ToList();

officesList.AddRange(noCountryAssoList);
break;

パフォーマンスの観点から、続行するためのより良い方法はありますか?

4

7 に答える 7

2

この種のことで気付くパフォーマンスの違いは非常に小さいため、心配する必要はありません。まだ行っていない場合は、Linq を使用してロジックを実行し、好きなように並べ替えるだけなので、削除/挿入を行う必要はありません。

次に、パフォーマンスをさらに向上させたい場合は、Plinq を使用してロジックを複数のコアに分散することを検討してください。

于 2012-09-21T07:42:58.637 に答える
2

最善の方法は、カスタム関数を使用して並べ替えることです。

デリゲートとして行うことができます:

list.Sort((first, second) =>
      {
         // Your code to compare first and second items
         // return 0 if equal, -1 or +1 for other cases
      });

すべてのプロセスを 1 つのパスで実行できます。国を指定せずにオフィスを抽出する必要はありません。

于 2012-09-21T07:43:13.473 に答える
2

確かにあります。これを試してください:

List<Office> list = new List<Office>(...);

list.Sort((x, y) => x.Country == null ? (y.Country == null ? 0 : -1) :
    (y.Country == null ? 1 : Comparer<Office>.Default.Compare(x, y))

または、比較子をより適切に実装する必要があります (並べ替えを再利用する場合)。

class OfficeComparer : IComparer<Office>
{
    public int Compare(Office a, Office b)
    {
        return a.Country == null ? (b.Country == null ? 0 : -1) :
            (b.Country == null ? 1 : Comparer<Office>.Default.Compare(a, b))
    }
}

次に、それを使用できます。

List<Office> list = new List<Office>(...);
list.Sort(new OfficeComparer());
于 2012-09-21T07:43:35.207 に答える
2

これを行う最善の方法は、比較器を実装することです。

class OfficeComparer:IComparer<Office>
{
        int IComparer.Compare(Office a, Office b)
        {
               if ( a.Office.Country != null && b.Office.Country != null) 
                       return a.Office.Country.CompareTo(b.Office.Country);
               if ( a.Office.Country == null && b.Office.Country != null) return -1;
               if ( a.Office.Country != null && b.Office.Country == null) return 1;  
               return 0; // if both have no country, return equal or whatever other criteria comparaison

        }
}

あなたの比較では、国なしで office に低い優先度を与えてから、 sort メソッドを呼び出すだけです:

List<Office> lst = FillList();

lst.sort(new OfficeComparer());
于 2012-09-21T07:44:24.347 に答える
0

IComparable または ICompare インターフェイスを使用して、2 つのオブジェクトのどちらのオブジェクトが 2 番目より「大きい」かを定義できます。

詳細については、Visual C# で IComparable および IComparer インターフェイスを使用する方法に関するこのナレッジ ベース記事を参照してください。

于 2012-09-21T07:43:42.023 に答える
-1

Java では、インターフェイスを実装Comparable<T>してから、 を呼び出してリストを並べ替えることができますjava.util.Collections.sort(List<T> list)

詳細を見る:

public class Office implements Comparable<Office> {
  private String country;
  public int compareTo(Office off) {
    if (this.country == null)
      return -1;
    else if (off.country == null)
      return 1;
    else
      return this.country.compareTo(off.country);
  }
}

リストを並べ替える:

java.util.Collections.sort(yourOfficeList);
于 2012-09-21T07:40:45.723 に答える