2

我有一个列表,我想以与当前相反的顺序对结果进行排序,以模仿用户单击列标题超链接。目前,我有以下内容:

 dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName));

但这只会升序排列。我知道按降序排序我会这样做:

 dsList.Sort((x, y) => String.CompareOrdinal(x.DisplayName, y.DisplayName)*-1);

但是,我不想检测它当前是什么并决定要做什么。

说得通?

格拉西亚斯。

为了澄清,我不能使用 Reverse 因为我有超过 1 列可以排序,所以我需要能够指定要排序的值。

以下适用,但不适用于空值。如果有空白,排序就会卡住。

  dsList.Sort((x, y) => String.CompareOrdinal(x.Surname, y.Surname) * (strB != null && (strA != null && String.Compare(strA, strB) == -1) ? -1 : 1));
4

3 回答 3

1

为什么不使用 Linq 扩展Reverse()?这可以让您在不知道当前排序的情况下在升序和降序之间切换。如果您想使用它,请确保您正在引用库并在源文件顶部System.Core声明 using 指令。System.Linq

另一种方法是创建一个从 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;
        }
    }
}
于 2013-01-16T02:18:52.117 回答
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));
于 2013-01-16T02:30:43.450 回答
0

如果您想要做的只是每次都简单地反转当前顺序,您应该考虑使用 .Net 的 LINQ 中提供的Reverse方法

或者

您可以简单地来回传递一个方向的值。这将允许将排序行为绑定到页面的所需状态,为此考虑一个隐藏字段。

于 2013-01-16T02:18:08.203 回答