在 List<T>.BinarySearch 之前排序

Sorting before List<T>.BinarySearch

我的数据库 table 是通过 class MyClass:

描述的
public class MyClass
{
 public int ID {get; set;}
 public int AnotherID {get; set;}
 public string Variation {get; set;}
}

BinarySearch 之前,我可以通过 SQL Order By [Variation] 对列表进行排序,然后通过 SQL 服务器对其进行排序,或者通过 List<T>.Sort() 使用 Web 服务器对其进行排序.这些列表在任何情况下是否绝对相等?

P.S。感兴趣的 column/property 是 Variation。 SQL 服务器:T-SQL,Web 服务器:IIS。

如果您在应用程序级别执行此操作,则需要实施 IComparable<T> 以告知 .NET 如何对您的列表进行排序。 List<T>Sort() 函数使用此接口来决定列表成员如何相互比较。对于简单的内置类型,此接口已在框架中实现。自己的类,需要自己动手

除了使用 Sort(),您还可以使用 LINQ 的 OrderBy(),使用 lambda 函数。然后,您可以在结果列表中应用 BinarySearch()。像这样:

var OrigList = context.GetData().ToList(); //or whatever Model function you have
var SortedList = OrigList.OrderBy(i => i.Variation);
var Result = SortList.BinarySearch(/*your condition*/);

在 SQL 水平上做这件事总是一个选择。但是你应该考虑你是否总是需要输入是排序的形式。否则,如果需要多次调用此函数,这可能会产生开销。

编辑

没错。您想知道 .NET 处理 string 比较的方式是否与 SQL 服务器处理 varchar 的方式完全相同。这已在 this SO post.

中讨论过

您必须在每一端指定一个 collation/locale,确保它们相同。

即便如此,我也不确定这是否是可靠的保证。当 Windows 的新版本问世时,可以更新语言环境,我不确定是否允许他们更改版本之间的排序顺序。最安全的解决方案可能是始终在应用程序端进行排序。

是的,这取决于您的列值,例如,如果您使用主键排序,那么列表在任何情况下都将是绝对相等的。 考虑到您的 ID 列主键:

var SortedAsc = OrigList.OrderBy(i => i.ID);
var SortedDesc = OrigList.OrderByDescending(i => i.ID);