2

次のようなクラス定義があります。

public class MyObjectModel
{
   public int ObjectID { get; set; }

   //for when the user's data is split in 2 fields
   public string FirstName { get; set; }
   public string LastName { get; set; }

   //for when the user's data is all in one field
   public string FirstLastName { get; set; }
}

これらのリストがありMyObjectModel、カスタムソートプロセスで名前でソートしたいのは、データに含まれているかどうかLastName(この場合はを使用してソートLastName)または単にFirstLastName(この場合は文字列を分割するつもりです) 2 番目の項がある場合はその項で並べ替え、単語が 1 つしかない場合は文字列全体で並べ替えます)。

私は2つのことについて確信が持てません:

  1. またはを使用する必要がありますIComparerIComparable
  2. 並べ替えの順序を決定したら (私はそれを行うことができます)、メソッドの出力が を表す int のリストになるようにするにはどうすればよいですかObjectID
4

4 に答える 4

3

Linq を使用します。

  List<MyObjectModel> objects = new List<MyObjectModel>();
  List<int> ids = objects.OrderBy(o => FunctionWhichReturnsNameForSort(o)).Select(o => o.ObjectID).ToList();

FunctionWhichReturnsNameForSort別のクラス、拡張機能、またはメンバーとして実装できます。

// should be in a static helper class
public static string NameForSort(this MyObjectModel obj)
{
  if (!string.IsNullOrEmpty(obj.LastName)) return obj.LastName;

  return obj.FirstLastName.Split(... // your splitting logic goes here
}

var ids = objects.OrderBy(o => o.NameForSort()).Select(o => o.ObjectID).ToList();
于 2012-10-03T16:11:07.460 に答える
2

この奇妙な二重の解決策が本当に必要な場合は、この問題や同様の問題に頻繁に遭遇します。より一般的な解決策として、名前のビジネス ロジックをいくつかの読み取り専用プロパティに配置することを検討してください。

//for when the user's data is split in 2 fields
public string FirstName { get; set; }
public string LastName { get; set; }

//for when the user's data is all in one field
public string FirstLastName { get; set; }

public string FullName
{
   get { ... }  // pick from LastName, FirstName, FirstLastName 
}

public string SortName
{
   get { ... }  // pick from LastName, FirstLastName 
}

ソートの順序を決定したら (私はそれを行うことができます)、メソッドの出力が ObjectID を表す int のリストになるようにするにはどうすればよいですか?

result = MyObjectList
          .OrderBy(m => m.SortName)   // sort on SortName
          .Select(m => m.ObjectID)    // select the Id
          .ToList();
于 2012-10-03T16:11:59.160 に答える
1

他の人が示唆しているように、LINQ を使用することはできますが、既存のリストを変更するのではなく、新しいリストを作成する必要があります。それは好ましいかもしれないし、そうでないかもしれません。リスト自体を並べ替えたい場合は、それも簡単です。

List<string> list = new List<string>(){"a","b","c"};

list.Sort((a,b)=> a.CompareTo(b));

リストを取得し、 を呼び出してSort、2 つの項目を取り、どちらが大きいかを示す整数を返すラムダを渡すだけです。あなたの場合、いくつかのメソッドを呼び出しab文字列を取得し、それらの 2 つの文字列に対してCompareToorstring.Compareを使用します。

于 2012-10-03T16:15:54.413 に答える
1

この並べ替えが 1 つのユース ケースに固有のものである場合は、LINQ を使用して実現できます。

var sortedIds = models.OrderBy(SecondName).Select(m => m.ObjectId).ToList();

private static string SecondName(MyObjectModel model)
{
  if (!string.IsNullOrWhitespace(model.LastName)) return model.LastName;
  return model.FirstLastName.Split(' ').Last();
}
于 2012-10-03T16:11:29.003 に答える