【问题标题】:Linq OrderBy against specific values considering lowercase inputsLinq OrderBy 针对考虑小写输入的特定值
【发布时间】:2015-11-30 06:44:19
【问题描述】:
string[] userInputs= {  "a","c","b"}
DataRow[] datarows=//datarows contains values like "A","B","C","D","E" 
List<DataRow> data = datarows.CopyToDataTable().AsEnumerable().ToList();

 IEnumerable<DataRow> orderedData = data.OrderByDescending(item => Array.IndexOf(userInputs, item.Field<string>(columnName)));

//我的数据行包含所有大写的值,但如果用户以小写输入,那么它不起作用linq-orderby-against-specific-values

编辑:我不能强制用户在 Lower/Upper 中提供输入,甚至我的 DataRow 也将包含 Both lower/upper 中的数据。无论大小写如何,查询都应该有效。

【问题讨论】:

  • 把用户输入转换成大写吧?

标签: c#


【解决方案1】:

在处理文本时最好使用文化安全的比较。即使您现在认为您的代码永远不会本地化或使用来自其他文化的输入数据,最好养成正确编写代码的习惯。

在这种情况下,这意味着使用来自StringComparer 的不区分大小写的比较器之一。例如:

string[] userInputs= {  "a","c","b"};
DataRow[] datarows=//datarows contains values like "A","B","C","D","E" 
List<DataRow> data = datarows.CopyToDataTable().AsEnumerable().ToList();
StringComparer comparer = StringComparer.CurrentCultureIgnoreCase;

IEnumerable<DataRow> orderedData = datarows
    .OrderByDescending(item => Array.FindIndex(
        userInputs, input => comparer.Equals(input, item.Field<string>(columnName))));

注意:出于某种原因,您的原始代码示例使用OrderByDescending(),我在上面的示例中重复了该用法。但是当然,这显然会导致数据行的顺序实际上是userInputs 中原始顺序的reverse

【讨论】:

  • 谢谢彼得,您的代码正在运行..非常感谢
【解决方案2】:

如果您的数据行已经是大写,那么只需强制用户输入也为大写。

string[] userInputs= {  "a","c","b"}.Select(x => x.ToUpperInvariant())
                                    .ToArray();

【讨论】:

  • 使用 ToUpper() 不是文化安全的,而且几乎从来都不是进行不区分大小写比较的正确方法,并且任何时候使用或(特别)推荐其他人,应该总是带着这个警告。
  • ToUpperInvariant() 怎么样?
  • ToUpperInvariant() 以可预测的方式使您不安全,但它仍然不是文化安全的(即不以文化适当的方式提供平等比较)。注意:我不反对使用诸如ToUpper()/ToLower() 之类的快捷方式和不变版本在确定文化设置不会成为问题的上下文中进行比较;但必须在充分了解影响/权衡的情况下完成。恕我直言,建议使用这些的一个很好的答案将描述这些影响和权衡,以便可能使用它的人了解技术风险和限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-21
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
相关资源
最近更新 更多