【问题标题】:Substring a string value in string array?在字符串数组中对字符串值进行子串化?
【发布时间】:2015-10-22 11:08:16
【问题描述】:

我有一个字符串数组传递给一个方法:

private DataTable buildDataTableFromErrorPairs(string[] ErrorPairs)
{ ... }

我想判断数组中的字符串是否长度大于 150 个字符,如果是,则截断它。我知道数组中最多只有一个长度大于 150 的字符串。尝试了一些 LINQ,但显然原始字符串没有改变:

var error = ( from e in ErrorPairs
              where e.Length > 150
              select e
            ).FirstOrDefault();

error = error.Substring(0, 100);

尝试了这个可能更接近的 lambda:

ErrorPairs = ErrorPairs.Select(s => s.Substring(0, 150)).ToArray();

大概我必须在找到和子串化有问题的值之后创建一个新的字符串数组?我通常在 WPF 中工作并使用List<T>,所以在删除和添加元素方面没有问题!

【问题讨论】:

    标签: c# arrays string linq


    【解决方案1】:

    如果你想使用 LINQ,你确实必须创建一个新数组,因为 LINQ 不操纵输入。

    您可以改用for 循环:

    bool foundTooLongError = false;
    for (int i = 0; i < ErrorPairs.Length; i++)
    {
        if (ErrorPairs[i].Length > 150)
        {
            ErrorPairs[i] = ErrorPairs[i].Substring(0, 150); // replace
    
            foundTooLongError = true;
            break; // only you are sure there is just one
        }
    }
    

    它将遍历整个列表并替换每个违规行。显然,如果你知道它只是一个,你可以在找到一个太长的字符串后break;

    【讨论】:

    • 这更有效,并且还有一个好处是您知道是否存在大于 150 个字符的字符串,因为这似乎是另一个要求。您可以简单地将true 分配给在循环外声明的bool 变量。
    【解决方案2】:

    首先,如果您想知道数组中是否有至少一个大于 150 的字符串,您可以使用:

    Boolean error = ErrorPairs.Any(e => e.Length > 150);
    

    然后,对于截断数组,您几乎可以找到答案

    ErrorPairs = ErrorPairs.Select(s => s.Substring(0, 150)).ToArray();
    

    只需修改:

    ErrorPairs = ErrorPairs.Select(s => s.Length > 150 ? s.Substring(0, 150) : s).ToArray();
    

    就是这样;)

    【讨论】:

    • 如果需要,则不考虑“想要辨别数组中的字符串是否长度大于 150 个字符”。
    • ?就像跨过 Length
    • @TimSchmelter 我编辑并添加了“任何”查询。但我不确定在截断数组之前测试它是否重要。好吧,Hardgraf 会看到 :)
    • @Xaruth:我也不知道,但 OP 已经提到了。但是,最好有一种方法在一个查询中同时执行这两项操作,而不是两次枚举数组。但是要提供一个 LINQ 查询来做这两件事并不容易,就像 Patrick 的循环所做的那样。
    【解决方案3】:

    你快到了。您可以在 LINQ 语句中使用 Substring

    var error = (from e in ErrorPairs
                 where e.Length > 150
                 select e.Substring(0,150)).SingleOrDefault();
    

    另外,由于最多只有一场比赛,您可以使用SingleOrDefault()

    【讨论】:

    • 是的,我熟悉您提出的 linq 查询语法。需要修改原始数组,谢谢@Grant Winney
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2021-09-30
    相关资源
    最近更新 更多