每次添加项目时对列表<t>属性进行排序</t>

时间:2014-09-09 10:01:42

标签: c# linq list sorting

我在一个类中有一个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()方法。理想情况下,每次添加项目或阅读项目时,列表都会被排序。

6 个答案:

答案 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”的值,或者只提供一些默认值。或者也许你可以找到一些利用领域的方法。