![](/img/trans.png)
[英]C# RadGridView SortOrder ascending on ImageColumn - image sorting behaviour
[英]Change C# sorting behaviour
让我们说我有字符串abc_
和abc2_
。 现在,通常排序时I C# abc2_
要跟从abc_
,留下的结果:
abc_
abc2_
如果重要的话,我用这个来排序:
var element = from c in elements
orderby c.elementName ascending
select c;
我怎么能改变这个? 我希望abc_能够到最后。 反转不是一个选项,因为列表包含两个以上的元素。
OrderBy
方法可以采用IComparer<T>
参数。 (我不确定该重载是否可以与查询理解语法一起使用,或者它是否仅在使用fluent扩展方法语法时可用。)
由于不清楚你的排序算法究竟应该涉及什么,我将继续实现所需的IComparer<T>
作为读者的练习。
最简单的解决方案是使用.NET Framework内置的序数字符串比较器:
var element = from c in elements
.OrderBy(c => c.elementName, StringComparer.Ordinal)
select c;
无需自定义Comparer类!
如果你想强调不参与比较,我们就可以做到这一点。 所以:
class CustomComparer : Comparer<string>
{
public override int Compare(string a, string b)
{
//Jamiec fixed the line below.
return a.Replace("_", "").CompareTo(b.Replace("_", ""));
}
}
var customComparer = new CustomComparer();
var element = elements.OrderBy(c => c.elementName, customComparer);
我仍然不确定我们试图解决的实际模式,但我写了我认为可以解决的问题。 我看到“_”是一种通配符,其中“abc2_”将是“abc_”的子集。 但是从OP的评论“bar_”<“barxyz”打破了我的理解。 这是我的代码,当我获得更多清晰度时,我可以修改。
static void Main(string[] args)
{
List<Element> Elements = new List<Element>();
Elements.Add(new Element("abc_"));
Elements.Add(new Element("abc2_"));
Elements.Add(new Element("aaa"));
var max = Elements.Max(e => e.Name.Length);
var result = Elements.OrderBy(e => e.Name, new CustomComparer(max));
foreach (var item in result)
Console.WriteLine(item.Name);
Console.Read();
}
class Element
{
public string Name { get; private set; }
public Element(string name)
{
this.Name = name;
}
}
class CustomComparer : Comparer<string>
{
private const string cWildCard = "_";
private const char cHeavyChar = 'Z';
public int Max { get; private set; }
public CustomComparer(int max)
{
this.Max = max;
}
public override int Compare(string a, string b)
{
string comp1 = string.Empty, comp2 = string.Empty;
int index = a.IndexOf(cWildCard);
if (index > 0)
comp1 = a.Substring(0, index).PadRight(this.Max, cHeavyChar);
index = b.IndexOf(cWildCard);
if (index > 0)
comp2 = b.Substring(0, index).PadRight(this.Max, cHeavyChar);
int result = comp1.CompareTo(comp2);
return result;
}
}
你可以看到我只是在找到“_”的位置加权一个字。 如果这是在正确的轨道上,请告诉我。
使用CompareOptions.Ordinal就可以了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.