[英]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.