2010-03-10 6 views
2

Я перебираю массив, и там есть строка, которая читается следующим образом: «1001 - какой-то ингредиент».Каков наилучший способ удаления фрагментов строки? (C#)

Прямо сейчас, как я проходной массива я получаю всю строку

string ingCode = theData[i + 1]; 

Но что мне действительно нужно, это просто «1001», а не все Шибано.

+0

это всегда тот же формат, т. Е. Вы хотите, чтобы часть, предшествующая -? – Pharabus

+0

Каковы критерии для части строки, которую вы хотите сохранить, или части строки, которую вы хотите отменить? – jball

+0

Да, я хочу все, что предшествует «-». Я попробовал theData [i + 1] .Split ("-") [0], но ReSharper говорит: «строка типа аргумента не назначается параметру type char». – Matt

ответ

9

комбинат некоторые из других методов, перечисленных для того, чтобы получить первую часть или код

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

Это позволяет обрабатывать коды ингредиентов дольше (или короче), чем 4 символа.

Если разделитель изменяется, но информация, которую вы хотите, всегда является числом, а затем используйте Regex для разбора только чисел.

+0

Это, безусловно, самый эффективный, точный и подходящий ответ на вопрос. (Отредактирован ответ, чтобы исправить небольшую ошибку опечатки :-)) –

+0

+1 Это работает для большего количества вариаций строки – Javier

+0

@Aviad P. - Спасибо. Это то, что я получаю для копирования/вставки кода. –

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

Но тогда Left (4) будет Hell .. :-P – Patrick

+0

@Patrick - это выглядит так :-p, я все еще думаю пользовательский класс расширения - это правильный путь, если вы планируете его повторно использовать :). – JonH

3

Вы можете использовать SubString метод:

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

Выход консоли это:

Обращались ли Вы к этому?

EDIT:

После просмотра комментариев, если вы не знаете точно, сколько номеров пред «-», лучшим ответом является один propossed по @Rob Аллен. Я даю ему +1.

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

Я мог бы также искать первый индекс, если «-» вместо предположения, что он всегда будет 4 цифры. – Mark

+0

@Mark, @Aviad P: @Matt опубликовал свой комментарий, рассказывающий, что 20 минут. назад, и я ответил на вопрос до этого, 26 мин. назад, поэтому я думаю, что я не заслужил нисходящее движение. – Javier

+0

Отменено нижний предел. –

3

если разделитель всегда «-», вы можете дать выстрел:

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

Если вы всегда заинтересованы в цифрах в начале строки, попробуйте RegEx:

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

Хотя это правильно, это лишний вопрос для этого вопроса, split создает массив всех подстрок между разделителем, но нас интересует только первый элемент. Regex - это общее решение, но на самом деле это не требуется для этой простой задачи - и читаемость является недостатком. –

+0

Split только создает * all * substrings, если вы попросите его использовать вместо этого Split (массив []() [], Int32), если вы не хотите их всех. Но да, все еще неэффективен, так как вам не нужна вторая часть. –

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]; 

Предполагает мы ищем 1 или более цифр в начале строки:

string ingCode = Regex.Match(theData[i + 1], @"^\d+").Captures[0]; 
Смежные вопросы