【问题标题】:How to use this class in my code [closed]如何在我的代码中使用这个类[关闭]
【发布时间】:2012-05-28 02:36:07
【问题描述】:

我看到了 Ian Griffiths 在 C# 中创建的这个自然排序类 (http://www.interact-sw.co.uk/iangblog/2007/12/13/natural-sorting)。

我想用它在我自己的代码中按对象名称对对象列表进行排序(另外,我将如何通过对象中的字段进行排序),我该怎么做?

我试过了,出现错误...

    System.Func<MyObjectClass, string> ConvertMyObject = str =>
    {
        return str.ToString();
    };
    listObjects = listObjects.OrderBy(str => Regex.Split(str, "([0-9]+)").Select(ConvertMyObject), new EnumerableComparer<MyObjectClass>());

谢谢!

/// <summary>
/// Compares two sequences.
/// </summary>
/// <typeparam name="T">Type of item in the sequences.</typeparam>
/// <remarks>
/// Compares elements from the two input sequences in turn. If we
/// run out of list before finding unequal elements, then the shorter
/// list is deemed to be the lesser list.
/// </remarks>
public class EnumerableComparer<T> : IComparer<IEnumerable<T>>
{
/// <summary>
/// Create a sequence comparer using the default comparer for T.
/// </summary>
public EnumerableComparer()
{
    comp = Comparer<T>.Default;
}

/// <summary>
/// Create a sequence comparer, using the specified item comparer
/// for T.
/// </summary>
/// <param name="comparer">Comparer for comparing each pair of
/// items from the sequences.</param>
public EnumerableComparer(IComparer<T> comparer)
{
    comp = comparer;
}

/// <summary>
/// Object used for comparing each element.
/// </summary>
private IComparer<T> comp;


/// <summary>
/// Compare two sequences of T.
/// </summary>
/// <param name="x">First sequence.</param>
/// <param name="y">Second sequence.</param>
public int Compare(IEnumerable<T> x, IEnumerable<T> y)
{
    using (IEnumerator<T> leftIt = x.GetEnumerator())
    using (IEnumerator<T> rightIt = y.GetEnumerator())
    {
        while (true)
        {
            bool left = leftIt.MoveNext();
            bool right = rightIt.MoveNext();

            if (!(left || right)) return 0;

            if (!left) return -1;
            if (!right) return 1;

            int itemResult = comp.Compare(leftIt.Current, rightIt.Current);
            if (itemResult != 0) return itemResult;
        }
    }
}
}

【问题讨论】:

  • 欢迎来到 StackOverflow。到目前为止,您尝试过哪些对您不起作用的方法?你到底在问什么?看来您的帖子是“我有这个代码。我该如何使用它?”,在这种情况下,这不是一个合适的问题。我们不是教程网站。如果您有具体问题,请询问他们,我们会看看是否可以提供帮助。谢谢。 :-)
  • 你为什么不问这个代码作者呢?
  • 谢谢,我并不是要寻求“教程”本身。所以我尝试的是 Enumerable test = new Enumerable(); listObjects.Sort(test.Compare()); // List listObjects
  • 我不明白这个问题,在你自己的项目中实现这个代码很容易。在您提供的链接中甚至还有一个如何调用该方法的示例:interact-sw.co.uk/iangblog/2007/12/13/natural-sorting
  • 我不太明白示例中发生了什么。其实我一开始以为是用 Python 写的,哈哈

标签: c# list sorting


【解决方案1】:

当“正常”排序不符合您的需要时,他提供的自然排序方法非常有用。例如,对字符串进行排序的“正常”方式是按字母顺序排列的,因此我们需要一种解决方法。

但是,在您的示例中,您尝试对自定义对象进行排序——这意味着您可以提供自己的排序规则!

要定义这些规则,implement IComparable 根据您从对象中选择的任何字段进行自己的比较。

您可以让排序首先检查您描述的“名称”字段,如果它们匹配,然后比较数字字段。

但是,如果您确实需要对给定字段进行自然排序,那么您仍然可以使用这种更易于理解的技术来调整博客的便捷 EnumerableComparer。 (简单比较左边的 Regex.Split(str.Replace(" ", ""), "([0-9]+)").Select() 和右边的)

最后,如果是 LINQ 表达式让你很难过,check out this LINQ-less approach.

【讨论】:

  • 感谢您的解释(和耐心),我会看看您的建议并自己解决。
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2013-11-28
  • 2018-04-16
  • 2023-04-03
  • 2023-02-12
  • 2016-10-05
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多