2013-09-29 3 views
1

У меня есть строка, которая ее первая часть представляет собой строку и последний один ряд, например:номер Дробление и строка с помощью LINQ

ahde7394

так, что я хотел бы получить это:

ahde

Я думал сначала извлечь строку, а затем из последней позиции символа не получить номер до конца ул кольцо, так что я думаю, что с помощью индексаторах можно сделать как-то:

var stringQuery = NameComp.Select((str,index) => new {myStr=str, position=index}) 
               .Where(c => !Char.IsDigit(c.myStr)).Select((ch,pos) => new { newStr=ch, pos=pos}); 

тогда я мог бы сделать:

1) Для того, чтобы получить строку: stringQuery.newStr

2) Для того, чтобы получить номер: stringQuery. Пропустить (stringQuery.pos). Выбрать (d => d);

, но он не работает, после получения stringQuery я не могу получить доступ к его элементам, как это анонимный тип ....

Любые идеи?

Решение с помощью LINQ, догадываясь, что ул = "ahde7394":

string letters = new string(str.TakeWhile(c => Char.IsLetter(c)).ToArray()); 

и номер:

string number = new string(str.Skip(letters.Length).TakeWhile(c => Char.IsDigit(c)).ToArray()); 

или лучше угадывание последнюю часть является номер:

string number = str.Substring(name.Length); 

ответ

4

Я согласен с DTB, что LINQ, вероятно, не является правильным решением.

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

var str = "ahde7394"; 

var regex = Regex.Match(str, @"([a-zA-Z]+)(\d+)"); 

var letters = regex.Groups[1].Value; // ahde 
var numbers = regex.Groups[2].Value; // 7394 
+0

+1 Regex - лучшее решение здесь – Alireza

+0

Это очень приятное решение. В любом случае использование Linq также может быть выполнено. См. Мое обновленное сообщение. Мне интересно, что в этом случае более эффективно и быстро ... кто-нибудь знает? – user304602

+1

Производительность в этом конкретном экземпляре и с этими конкретными размерами была бы незаметной. –

1

LINQ может быть не лучшим решением здесь. Посмотрите на String.IndexOfAny Method:

char[] digits = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; 

string input = "ahde7394"; 

int index = input.IndexOfAny(digits); 

string head = input.Substring(0, index); // "ahde" 
string tail = input.Substring(index);  // "7394" 
1

Вы можете использовать String.IndexOf и String.Substring нравится;

string s = "ahde7394"; 
int index = 0; 
foreach (var i in s) 
{ 
    if(Char.IsDigit(i)) 
    { 
     index = s.IndexOf(i); 
     break; 
    } 
} 

Console.WriteLine(s.Substring(0, index)); 
Console.WriteLine(s.Substring(index)); 

Выход будет;

ahde 
7394 

Здесь в DEMO.