我在C#中看到了Ian Griffiths创建的这个自然排序类(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;
}
}
}
}
答案 0 :(得分:0)
当“正常”排序不符合您的需要时,他提供的自然排序方法非常有用。例如,对字符串进行排序的“正常”方式是按字母顺序排列的,因此我们需要一种解决方法。
但是,在您的示例中,您尝试对自定义对象进行排序 - 这意味着您可以提供自己的排序规则!
根据您从对象中选择的任何字段,使用您自己的比较来定义这些规则implement IComparable。
您可以首先检查您描述的排序'名称'字段,如果它们匹配,则比较数字字段。
但是,如果您确实需要在给定字段上进行自然排序,那么您仍然可以使用这种更易于理解的技术来调整博客方便的EnumerableComparer。 (简单地比较左边的Regex.Split(str.Replace(“”,“”),“([0-9] +)”)。选择右边的()
最后,如果是LINQ表达式让你很难,check out this LINQ-less approach.