C# 在字符串数组中为字符串值添加子字符串?

C# 在字符串数组中为字符串值添加子字符串?,c#,arrays,string,linq,C#,Arrays,String,Linq,我将一个字符串数组传递到一个方法中: private DataTable buildDataTableFromErrorPairs(string[] ErrorPairs) { ... } 我想辨别数组中的字符串长度是否大于150个字符&如果是,则截断它。我知道数组中最多只能有一个长度大于150的字符串。尝试了一些LINQ,但显然原始字符串没有更改: var error = ( from e in ErrorPairs where e.Length > 150

我将一个字符串数组传递到一个方法中:

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
,因此在删除和添加元素时不会出现问题

你就快到了。您可以在LINQ语句中使用
子字符串

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

另外,由于最多有一个匹配项,因此可以使用
SingleOrDefault()

您就快到了。您可以在LINQ语句中使用
子字符串

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

此外,由于最多会有一个匹配项,因此可以使用
SingleOrDefault()

如果要使用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
    }
}
bool foundtoolongeror=false;
for(int i=0;i150)
{
ErrorPairs[i]=ErrorPairs[i]。子字符串(0,150);//替换
FoundToolLongError=true;
break;//只有您确定只有一个
}
}

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

如果要使用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
    }
}
bool foundtoolongeror=false;
for(int i=0;i150)
{
ErrorPairs[i]=ErrorPairs[i]。子字符串(0,150);//替换
FoundToolLongError=true;
break;//只有您确定只有一个
}
}

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

首先,如果您想知道数组中是否至少有一个字符串大于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,可以使用:

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个字符”。?充当if,因此跨过长度<150的元素,非常棒。在数组上使用forEach实际上不会更改原始数组值。大概是因为数组及其元素是不可变的。@TimSchmelter我编辑并添加了“Any”查询。但我不确定在截断数组之前测试它是否重要。好吧,哈德格拉夫会看到:)@Xaruth:我也不知道,但OP已经提到了。但是,最好有一种方法,可以在一个查询中同时执行这两个操作,而不是枚举数组两次。但是,要提供一个同时执行这两项功能的LINQ查询并不容易,这与Patrick循环的功能类似。如果需要的话,不考虑“想要识别数组中的字符串长度是否大于150个字符”。?充当if,因此跨过长度<150的元素,非常棒。在数组上使用forEach实际上不会更改原始数组值。大概是因为数组及其元素是不可变的。@TimSchmelter我编辑并添加了“Any”查询。但我不确定在截断数组之前测试它是否重要。好吧,哈德格拉夫会看到:)@Xaruth:我也不知道,但OP已经提到了。但是,最好有一种方法,可以在一个查询中同时执行这两个操作,而不是枚举数组两次。但是要提供一个同时执行这两项功能的LINQ查询并不容易,就像Patrick的循环一样。是的,我熟悉您提出的LINQ查询语法。需要修改原始数组,谢谢@Grant WinneyYes,我熟悉您提出的linq查询语法。需要修改原始数组,谢谢@Grant winney这更有效,而且还有一个好处,即您知道字符串是否大于150个字符,因为这似乎是另一个要求。您可以简单地将
true
赋值给在循环外部声明的
bool
变量。这样更有效,而且您还可以知道字符串是否大于150个字符,因为这似乎是另一个要求。您可以简单地将
true
赋值给在循环外部声明的
bool
变量。