1

いくつかの連絡先が保存されているオブジェクトを含むBindingListがあります。

 internal static BindingList<object> contactList;

contactListオブジェクトはより多くのタイプです。SktContact、FBContact、GContact。

これらの連絡先は、contactList_ChangedイベントでlistBoxに追加します。しかし、私はそれらをステータス(最初はオンライン)でソートし、次にアルファベット順にソートしたいと思います。

私はこのように考えたいと思います:

  List<object> contactSorted = new List<object>();
  contactSorted = Global.contactList.ToList();

  contactSorted.OrderBy((status, name) => Converter.getContactAvailabilityStatus(contactSorted[?]), Converter.getContactName(contactSorted[?]));

  contactListBox.Items.AddRange(contactSorted.ToArray());

しかし、私はそれをどのように行うべきかわかりません。オブジェクトのリストを再入力して、注文するプロパティを選択できません。

任意のオブジェクトからステータスと名前を取得するメソッドがあります。しかし、どうすればそれを使用して連絡先配列を並べ替えることができますか?

自分の図面を使用しています所有者の図面を修正しました

 private void contactListBox_DrawItem(object sender, DrawItemEventArgs e)
4

2 に答える 2

3
  1. 連絡先タイプのインターフェースを使用できるように感じます。

    interface IContact
    {
        string Status { get; }
        string Name { get; }
    }
    
    class FBContact : IContact
    {
        public string Status
        {
            get
            {
                // Implement the status getter   
            }
        }
        public string Name
        {
            get
            {
                // Implement the contact name getter   
            }
        }
    } 
    
  2. それならただ

    var unsortedList = Global.contactList;
    var contactSorted = unsortedList.Cast<IContact>()
                                    .OrderBy(x => x.Status)
                                    .ThenBy(x => x.Name);
    
    contactListBox.Items.AddRange(contactSorted.ToArray());
    
于 2012-08-17T14:44:51.670 に答える
2

できることは、連絡先クラスのインターフェースを実装することです。

public interface IContact{
    string Name {get;set;}
    int Status{get;set;}
}

そして、クラス宣言を次のように変更します

public class SktContact: IContact {
    // Implementations
}
...

その後、インターフェース名でリストを宣言できます

var contacts= new List<IContact>():
// Populate contacts to the list

次に、リストを次のように注文します

var orderedList = contact.OrderByDescending(c=>c.Status).ThenBy(c=>c.name).ToList():

次に、リストアイテムを使用しているときに、GetType()メソッドを使用してそれらのタイプを判別し、適切なコードを使用してそれらを処理できます。

連絡先クラスの実装にアクセスできない場合は、Adapter Design Patternを使用して、コードとの互換性を持たせることができます。

于 2012-08-17T14:45:23.107 に答える