在 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);
我的数据库 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);