在desc或asc中排序列表,这取决于它当前是什么
本文关键字:取决于 是什么 列表 desc asc 排序 | 更新日期: 2023-09-27 17:53:55
我有一个列表,我想以与当前相反的顺序对结果进行排序,以模拟用户单击列标头超链接。目前,我有以下内容:
dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName));
但是这只对升序排序。我知道降序排序,我会这样做:
dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*-1);
但是,我不想检测它当前是什么,并决定做哪一个排序。
有意义吗?
谢谢。
为了澄清,我不能使用Reverse,因为我有多个列可以排序,所以我需要能够指定要排序的值。
下面的代码可以工作,但不能用于空值。如果有空格,排序就卡住了。
dsList.Sort((x, y) => String.CompareOrdinal(x.Surname, y.Surname) * (strB != null && (strA != null && String.Compare(strA, strB) == -1) ? -1 : 1));
dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*(dsList[0] < dsList[1]?-1:1));
编辑:在你的评论中,当有重复或空值时,似乎你有问题……这应该修复
dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*String.CompareOrdinal(dsList[0].DisplayName, dsList[dsList.Length-1].DisplayName));
为什么不使用Linq扩展Reverse()?这允许您在不知道当前排序的情况下在升序和降序之间切换。如果你想使用这个,确保你引用了System.Core
库,并在源文件的顶部声明了一个使用System.Linq
的using指令。
另一种方法是创建一个继承List的类,并对其进行如下修改:
public class LazyReversingList<T> : IList<T>
{
private Boolean m_SortedAscending;
private List<T> m_InnerList;
public Boolean IsReadOnly
{
get
{
return false;
}
}
public Boolean SortedAscending
{
get
{
return m_SortedAscending;
}
}
public Int32 Count
{
get
{
EnsureList();
return m_InnerList.Count;
}
}
public T this[Int32 index]
{
get
{
EnsureList();
return m_InnerList[index];
}
set
{
EnsureList();
m_InnerList[index] = value;
}
}
private void EnsureList()
{
if (m_InnerList == null)
m_InnerList = new List<T>();
}
public Boolean Contains(T item)
{
EnsureList();
return m_InnerList.Contains(item);
}
public Boolean Remove(T item)
{
EnsureList();
return m_InnerList.Remove(item);
}
public IEnumerator<T> GetEnumerator()
{
EnsureList();
return m_InnerList.GetEnumerator();
}
public Int32 IndexOf(T item)
{
EnsureList();
return m_InnerList.IndexOf(item);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
EnsureList();
return m_InnerList.GetEnumerator();
}
public void Add(T item)
{
EnsureList();
m_InnerList.Add(item);
}
public void Clear()
{
EnsureList();
m_InnerList.Clear();
}
public void CopyTo(T[] array, Int32 arrayIndex)
{
EnsureList();
m_InnerList.CopyTo(array, arrayIndex);
}
public void Insert(Int32 index, T item)
{
EnsureList();
m_InnerList.Insert(index, item);
}
public void RemoveAt(Int32 index)
{
EnsureList();
m_InnerList.RemoveAt(index);
}
public void Reverse()
{
if (!m_SortedAscending)
{
m_InnerList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName));
m_SortedAscending = true;
}
else
{
m_InnerList.Sort((x, y) => (String.CompareOrdinal(x.DisplayName, y.DisplayName) * -1));
m_SortedAscending = false;
}
}
}
如果你想做的只是每次反转当前的顺序,你应该考虑使用。net的LINQ
中提供的reverse方法或
你可以简单地来回传递一个方向的值。这将允许将排序行为绑定到所需的页面状态,为此考虑使用隐藏字段。