1
var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text };
list = list.OrderBy(x => int.Parse(x)).ToArray();

谁能建议如何修改上面的代码,以便为每个无法解析为整数的值返回一个空值?

我想我需要以Parse某种方式替换TryParse

澄清

该程序接受来自 3 个不同文本框的 3 个整数,对它们进行排序并将序列插入数据库。如果输入了非整数,我想将其视为空值。

例如,如果和TextBox1.Text = "",插入的序列将是:。TextBox2.Text = "45"TextBox3.Text = "8"0,8,45

但是,我现在认为从排序中排除非整数可能会更好,因此对于同一个示例,结果序列将类似于:8,45,N/A.

很抱歉无法清楚地解释我的要求。

4

4 回答 4

7

如果您真的在使用 LINQ to Objects,我会编写一个单独的方法:

public static int? ParseOrNull(string text)
{
    int result;
    return int.TryParse(text, out result) ? (int?) result : null;
}

然后:

list = list.OrderBy(x => ParseOrNull(x)).ToArray();

这将处理文本值,这些文本值要么是对非​​数字的真正字符串引用,要么是空引用。您可能希望重载ParseOrNull以接受IFormatProvider.

然而,这只是按一个可为空的 int排序。如果您希望将无效的值替换为 null,但其他值保留为字符串(按数值排序),我怀疑您想要更多类似的东西:

var result = list.Select(x => new { Text = x, Numeric = ParseOrNull(x) })
                 .OrderBy(pair => pair.Numeric)
                 .Select(pair => pair.Numeric.HasValue ? pair.Text : null)
                 .ToArray();

如果这些都不符合您的要求,请说明您的要求。

请注意,这些都不适用于 LINQ to SQL 或实体框架之类的东西,它们无法将您的方法转换为 SQL。

于 2013-02-22T17:11:24.250 回答
2

尝试这个:

var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text };
list = list.OrderBy(x =>
            {
                int val;
                return int.TryParse(x, out val) ? (int?)val : null;
            }).ToArray();
于 2013-02-22T17:12:06.580 回答
1

据我了解要求并阅读您的代码(将结果分配给同一个数组),您仍然希望字符串作为输出,但按其数值排序,并且您希望在结果数组中无法解析的字符串为null;

var result = 
    list
      .Select(x => { int tmp; return Int32.TryParse(x, out tmp) ? x : null; })
      .OrderBy(x => x);
于 2013-02-22T17:21:30.110 回答
-1

尝试这个:

    var list = new string[] { TextBox1.Text, TextBox2.Text, TextBox3.Text };
    list = list.OrderBy(x => ParseStringToInt(x)).ToArray();


    private int ParseStringToInt(string value)
    {
        int result;
        int.TryParse(value, out result);
        return result;
    }
于 2013-02-22T17:12:33.957 回答