doc.Load(Server.MapPath("\\CrystalReport1.rpt")",CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy)
//我的数据行包含大写的所有值,但如果用户以小写形式提供输入,则它不起作用linq-orderby-against-specific-values
编辑:我不能强迫用户在下/上提供输入,甚至我的DataRow也将包含下/上两个数据。无论如何,查询都应该有效。
答案 0 :(得分:3)
在处理文本时最好使用文化安全比较。即使您现在认为您的代码永远不会被本地化或使用来自其他文化的输入数据,最好养成正确执行代码的习惯。
在这种情况下,这意味着使用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
中原始订单的反向。
答案 1 :(得分:2)
如果您的数据行已经是大写,那么只需强制用户输入为大写。
string[] userInputs= { "a","c","b"}.Select(x => x.ToUpperInvariant())
.ToArray();