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
变量。