我在一个类中有一个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()
方法。理想情况下,每次添加项目或阅读项目时,列表都会被排序。
答案 0 :(得分:0)
您可以像这样更改属性,使用支持字段并在 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>
,以防止用户直接添加新项目。
答案 1 :(得分:0)
Handle通过类中的add方法添加。不能防止直接访问列表,但您可以根据排序要求将项目插入到列表的正确索引中。
这种方法可以帮助您将列表作为单击命中。
另一个要考虑的想法。
答案 2 :(得分:0)
您可以使用ObservableCollection Class
实现此类集合参考网址:http://msdn.microsoft.com/en-us/library/ms668604%28v=vs.110%29.aspx
答案 3 :(得分:0)
假设你的列表中没有重复项,你应该使用SortedSet它是一个集合,因此它不能包含两次相同的对象(但是你如何对相同的对象进行排序?),否则它完全符合你的需要。
您还可以考虑在包含列表的类中实现IEnumerable,这样您就可以简单地执行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();
}
}
答案 4 :(得分:0)
您可以在添加using System.Linq
之后使用System.Linq命名空间,然后您应该可以执行以下操作
List<string> list = new List<string>();
list = list.OrderByDescending(i => i).ToList();
如果您想按升序排序
list = list.OrderBy(i => i).ToList();
如果在添加项目后调用这些方法。您的列表将被排序。
答案 5 :(得分:0)
为什么不选择SortedList? 我猜这正是你要找的。您可以忽略SortedList中“short”的值,或者只提供一些默认值。或者也许你可以找到一些利用领域的方法。