根据特定条件在列表末尾移动列表项的有效方法

时间:2012-09-21 07:27:56

标签: c# visual-studio-2010 performance list sorting

如果List<Office>所在的Office是一个类,我必须按国家/地区对其条目进行排序(其中country是Office类的属性)。

某些办事处没有设置国家/地区,因此会显示在列表顶部。在这种情况下,我必须把它们放在列表的底部,因为它被认为“不太相关”。

switch (sortOptions.SortField)

...  

case OfficeSortField.Country:

var noCountryList = officesList.Where(a => string.IsNullOrEmpty(a.CountryText)).ToList();
officesList.RemoveAll(a => string.IsNullOrEmpty(a.CountryText));

officesList= sortOptions.SortOrder == SortOrder.Ascending
                                      ? officesList.OrderBy(o => o.CountryText).ToList()
                                      : officesList.OrderByDescending(o => o.CountryText).ToList();

officesList.AddRange(noCountryAssoList);
break;

在性能方面,是否有更好的方法可以继续?

7 个答案:

答案 0 :(得分:2)

你会注意到这些事情的表现差异会很小,不值得担心。如果您还没有这样做,我会使用Linq执行逻辑,只需按照您想要的任意排序,这样您就不必进行任何删除/插入。

然后,如果您想进一步提高性能,请使用Plinq将逻辑分布在多个内核上。

答案 1 :(得分:2)

最好的方法是使用自定义功能进行排序。

你可以作为代表:

list.Sort((first, second) =>
      {
         // Your code to compare first and second items
         // return 0 if equal, -1 or +1 for other cases
      });

您可以一次完成所有流程,不需要在没有国家/地区的情况下提取办公室。

答案 2 :(得分:2)

当然有。试试这个:

List<Office> list = new List<Office>(...);

list.Sort((x, y) => x.Country == null ? (y.Country == null ? 0 : -1) :
    (y.Country == null ? 1 : Comparer<Office>.Default.Compare(x, y))

或者,你应该更好地实现比较器(如果你要重用分类的东西)。

class OfficeComparer : IComparer<Office>
{
    public int Compare(Office a, Office b)
    {
        return a.Country == null ? (b.Country == null ? 0 : -1) :
            (b.Country == null ? 1 : Comparer<Office>.Default.Compare(a, b))
    }
}

然后你可以使用它:

List<Office> list = new List<Office>(...);
list.Sort(new OfficeComparer());

答案 3 :(得分:2)

最好的方法是实施comparer

class OfficeComparer:IComparer<Office>
{
        int IComparer.Compare(Office a, Office b)
        {
               if ( a.Office.Country != null && b.Office.Country != null) 
                       return a.Office.Country.CompareTo(b.Office.Country);
               if ( a.Office.Country == null && b.Office.Country != null) return -1;
               if ( a.Office.Country != null && b.Office.Country == null) return 1;  
               return 0; // if both have no country, return equal or whatever other criteria comparaison

        }
}

在你的比较器中,你只是给一个没有国家的办公室低优先级,然后只需调用排序方法:

List<Office> lst = FillList();

lst.sort(new OfficeComparer());

答案 4 :(得分:0)

您可以使用IComparable或ICompare接口,并定义两个对象的哪个对象比第二个对象“更大”。

您可以在How to use the IComparable and IComparer interfaces in Visual C#

上的知识库文章中找到更多内容

答案 5 :(得分:0)

这是最简单和最有效的,我检索所有物理书,因为我想推动类别&#34;其他&#34;列在列表的末尾。

List<Books> controlGroupDetails = controlDetails.Where(s => s.Title == "Physics").ToList();
var otherPhysics = controlDetails.Where(s => s.Title == "Physics" && s.Name == "Other").SingleOrDefault();
controlGroupDetails.Remove(otherPhysics);
controlGroupDetails.Insert(controlGroupDetails.Count(), otherPhysics);

答案 6 :(得分:-1)

在Java中,您可以实现Comparable<T>接口,然后通过调用java.util.Collections.sort(List<T> list)对列表进行排序。

查看详情:

public class Office implements Comparable<Office> {
  private String country;
  public int compareTo(Office off) {
    if (this.country == null)
      return -1;
    else if (off.country == null)
      return 1;
    else
      return this.country.compareTo(off.country);
  }
}

对列表进行排序:

java.util.Collections.sort(yourOfficeList);