如果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;
在性能方面,是否有更好的方法可以继续?
答案 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);