簡體   English   中英

排序清單 <T> 每次添加項目時的屬性

[英]Sort List<T> Property every time an item is added

我在一個類中有一個List作為屬性:

public List<string> MyList { get; set; }

數據將添加到此列表中,並最終將讀取數據。 讀取數據后,其讀取方式如下:

foreach(string str in my_obj.MyList)
{
   // do something
}

我當然可以:

foreach(string str in my_obj.MyList.Sort())
{
   // do something
}

但是,由於這是一個類庫,所以我不希望該用戶做任何事情。 我也不希望用戶必須在類中調用Sort()方法。 我理想的情況是,每次添加或讀取項目時都要對列表進行排序。

您可以像這樣更改屬性,使用背景字段並在將列表返回給調用方之前在getter方法中對其進行排序:

private List<string> _myList; 
public List<string> MyList
{
   get { _myList.Sort(); return _myList; }
   set { _myList = value; }
}

當然,當您嘗試將新項目添加到列表中時,這將執行排序,例如myobj.MyList.Add("foo"); 為了避免這種情況,您可以添加其他方法,例如AddToMyList並使用_myList.Add 。還可以更改屬性類型IEnumerable<string>以防止用戶直接添加新項目。

句柄通過類中的add方法添加。 不能防止直接訪問列表,但是您可以根據排序要求將項目插入列表的正確索引中。

這種方法使您不必再將列表作為一個命中項。

只是要考慮的另一個想法。

您可以使用ObservableCollection類實現此類收集

引用URL: http : //msdn.microsoft.com/zh-cn/library/ms668604%28v=vs.110%29.aspx

假設列表中沒有重復項,則應使用SortedSet這是一個集合,因此它不能兩次包含相同的對象(但是如何對相同的對象進行排序?),否則它確實可以滿足您的需求。

您還可以考慮在包含列表的類中實現IEnumerable ,這將使您能夠簡單地執行foreach(string str in my_obj)然后可以將列表foreach(string str in my_obj)私有,並在添加所有對象之后對其進行排序。 現在,每個獲得列表的用戶都可以更改列表,刪除項目等。這可能不是您想要的。

實現可以像這樣簡單:

public class MyClass : IEnumerable<string>
{
    private List<string> myList = new List<string>();

    public MyClass()
    {
        // Fill myList...
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return myList.GetEnumerator();
    }

    public IEnumerator<string> GetEnumerator()
    {
        return myList.GetEnumerator();
    }
}

您可以使用System.Linq命名空間,在using System.Linq添加后,您應該可以執行以下操作

List<string> list = new List<string>();
list = list.OrderByDescending(i => i).ToList();

或者,如果您想對升序進行排序

list = list.OrderBy(i => i).ToList();

如果添加項目后調用這些方法。 您的列表將被排序。

為什么不選擇SortedList呢? 我想這正是您想要的。 您可以只忽略SortedList中“ short”的值,也可以只提供一些默認值。 或者也許您也可以找到一些利用領域的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM