2010-03-10 109 views
2

我正在循环访问一个数组,并且在那里有一个字符串,像这样的例子:“1001 - 一些成分”。删除部分字符串的最佳方法是什么? (C#)

眼下,通过数组我环路我得到整个字符串

string ingCode = theData[i + 1]; 

但我真正需要的是简单的“1001”,而不是整个世邦。

+0

它是否始终是相同的格式,即您希望前面的部分 - ? – Pharabus 2010-03-10 17:09:36

+0

要保留的字符串部分或要丢弃的字符串部分的标准是什么? – jball 2010-03-10 17:09:38

+0

是的,我想要“ - ”之前的所有内容。我尝试了Data [i + 1] .Split(“ - ”)[0],但ReSharper说,“参数类型字符串不能分配给参数类型char”。 – Matt 2010-03-10 17:16:29

回答

9

结合一些的,以获得所述第一部分或所述代码列出的其他方法

string myString = "1001--Some ingredient"; 
string myPortionOfString = myString.Substring(0, myString.IndexOf("--")); 

这使您可以处理比4个字符更长(或更短)的成分代码。

如果分隔符发生变化,但所需信息始终为数字,则使用Regex解析出数字。

+0

这是迄今为止最有效,最简洁和最合适的答案。 (编辑答案修复一个小错字错误:-)) – 2010-03-10 17:33:50

+0

+1这适用于字符串的更多变体 – Javier 2010-03-10 17:44:56

+0

@Aviad P. - 谢谢。这就是我得到的复制/粘贴代码。 – 2010-03-10 17:46:45

0

您可以使用StringBuilder类,或通过在[0],[1],[2],[3]处附加索引来创建新字符串(如果您始终需要前4个字符) 您还可以创建一个左功能:

Console.Writeline(Left(myString, 4)); 

public static string Left(string param, int length)   
{   
string result = param.Substring(0, length);    
return result;   
} 

你可以做的另一件事是创建一个字符串扩展方法:

static class StringExtensions 
{ 
    public static String Left(this string str, int numbOfChars) 
    { 
    if(str.Length <= numbOfChars) return str; 
    return str.Substring(0, numbOfChars); 
    } 

    public static String Right(this string str, int numbOfChars) 
    { 
     if numbOfChars >= str.Length) return str; 
     return str.Substring(str.Length, str.Length-numbOfChars); 
    } 
} 

您可以拨打这个是这样的:

String test = "Hello World"; 
String str = test.Left(3); //returns Hel 
+0

但是然后左(4)将是地狱.. :-P – Patrick 2010-03-10 17:41:45

+0

@帕特里克 - 看起来如此:-p,我仍然认为如果您打算重用它,自定义扩展类是正确的方法:)。 – JonH 2010-03-10 17:49:10

3

您可以使用SubString方法:

string myString = "1001--Some ingredient"; 
    string myPortionOfString = myString.Substring(0, 4); 
    Console.WriteLine(myPortionOfString); 

控制台输出是这样的:

你指的这个?

编辑:

看到评论,如果您不知道到底有多少数量是前经过“ - ”,最好的答案是一个由@Rob艾伦 propossed。我给他+1。

//... 
string myPortionOfString = myString.Substring(0, myString.IndexOf("--")); 
//... 
+0

如果“ - ”代替假设总是4位数,我也可能会查找第一个索引。 – Mark 2010-03-10 17:23:00

+0

@Mark,@Aviad P:@Matt发表了他的评论,告诉他20分钟。之前,我在那之前回答了这个问题,26分钟。以前,所以我认为我不应该得到那种失望。 – Javier 2010-03-10 17:39:29

+0

取消了downvote。 – 2010-03-10 17:46:46

3

如果分隔符始终“ - ”,你可能会给一个镜头:

string ingCode = theData[i+1].Split('-')[0]; 

如果你在数字的字符串的开头一直有兴趣,尝试一个正则表达式:

string ingCode = System.Text.RegularExpressions.Regex.Match(theData[i+1], @"^([0-9]*)").ToString(); 
+3

虽然正确,但对于手头的问题来说这是一个矫枉过正的问题,split会在分隔符之间创建所有子字符串的数组,但我们只对第一个元素感兴趣。正则表达式是通用的解决方案,但对于这个简单的任务并不需要 - 而且可读性是一个缺点。 – 2010-03-10 17:37:34

+0

如果您要求它使用拆分(数组 []()[],Int32),而不是全部需要它们,则拆分仅创建* all *子字符串。但是,是的,因为你不需要第二部分,效率仍然很低。 – 2010-03-10 18:32:17

2

你可以使用正则表达式:

Regex rgx = new Regex(@"(?<Code>\d+)--(?<Ingedient>\w+)", RegexOptions.IgnoreCase); 
MatchCollection matches = rgx.Matches("1001--Some Ingredient"); 
foreach(Match match in matches) 
    Console.WriteLine("Code:{0}, Ingredient:{1}",match.Groups["Code"], match.Groups["Ingredient"]); 
1

能在几个不同的方式来完成,这取决于你知道什么数据将是什么样子。

假设我们一直在寻找的第4个字符:

string ingCode = theData[i + 1].Substring(0, 4); 

假设我们正在寻找之前无论发生什么事“ - ”:

string ingCode = theData[i + 1].Split(new string[] {"--"}, StringSplitOptions.None)[0]; 

假设我们正在寻找在字符串的开始处有一个或多个数字:

string ingCode = Regex.Match(theData[i + 1], @"^\d+").Captures[0]; 
相关问题