特定的顺序由Linq到SQL

本文关键字:Linq SQL 顺序 | 更新日期: 2023-09-27 18:05:31

是否可以根据特定的订单在Linq上订购?就像

List<bbHeader> bb = new List<bbHeader>();
bb.OrderBy(x => x.Country.CompareTo(new string[]{"AR","CL","PY","UY","AUP"}));
这个想法是Country字段按照字符串

特定的顺序由Linq到SQL

的特定顺序排序

在你的例子中有一个非常直接的方法:

var sequence = new [] { "AR", "CL", "PY", "UY", "AUP" };
List<bbHeader> bb = new List<bbHeadher>();
// fill bb
// takes the item, checks the index of the country in the array
var result = bb.OrderBy(x => Array.IndexOf(sequence, x.Country));

通过这种方式,您按照在序列字符串中找到的国家的索引排序。只要记住,未找到的项目将被-1,如果你愿意,你也可以修改。

如果您想做任何更复杂的事情,您可以创建自己的自定义IComparer类实现来使用自定义订单比较项目。然后可以将其传递给OrderBy。

这样的比较器是这样的:

public sealed class SequenceComparer : IComparer<string>
{
    private string[] _sequence { get; set; }
    public SequenceComparer(string[] sequence)
    {
        if (sequence == null) throw new ArgumentNullException("sequence");
        _sequence = sequence;
    }
    public int Compare(string x, string y)
    {
        if (ReferenceEquals(x, y)) return 0;
        return Array.IndexOf(_sequence, x).CompareTo(Array.IndexOf(_sequence, y));
    }
}

和可以这样调用:

var result = bb.OrderBy(x => x.Country, new SequenceComparer(new [] { "AR", "CL", "PY", "UY", "AUP" }));

两种方法都很好,后者很好且可重用,但前者(直接使用IndexOf)仍然非常简洁。你的选择。

你可以把你自己的委托传递给orderby函数,在这种情况下比较逻辑可以由你定义