简体   繁体   English

拆分一串数字和字符

[英]Split a string of Number and characters

I had a List liRoom which contains a alphanumeric and Alphabetic string For Example 我有一个列表liRoom,其中包含字母数字和字母字符串

List<string> liRoom = new List<string>() {"Room1","Room2","Room3",  
                                         "Room4","Hall","Room5","Assembly",  
                                         "Room6","Room7","Room8","Room9};

This List is of type Alphanumeric and Alphabetic so i want to take the max numeric value from this list of string. 此列表的类型为字母数字和字母,因此我想从此字符串列表中获取最大数值。
I had tried to do it this way 我试过这样做

var ss = new Regex("(?<Alpha>[a-zA-Z]+)(?<Numeric>[0-9]+)");  
List<int> liNumeric = new List<int>();  
foreach (string st in liRoom)  
{   
var varMatch = ss.Match(st);  
liNumeric.Add(Convert.ToInt16(varMatch.Groups["Numeric"].Value));   
}  
int MaxValue = liNumeric.Max();// Result Must be 9 from above Example.

And

 List<int> liNumeric = new List<int>();  
 foreach (string st in liRoom)  
 {   
   liNumeric.Add( int.Parse(new string(st.Where(char.IsDigit).ToArray())));   
 }  
 int MaxValue = liNumeric.Max();// Result Must be 9 from above Example.

But both shows error when st is Hall,Assembly 但是当stHall,Assembly时都显示错误
Help me How to do this. 帮帮我怎么做

there are few reasons you will get exception in your code. 您的代码中出现异常的原因很少。 I'm adding few condition for those possible exceptions. 我为这些可能的例外情况添加了一些条件。

List<int> liNumeric = new List<int>();  
 foreach (string st in liRoom)  
 { 
   // int.Parse will fail if you don't have any digit in the input 
   if(st.Any(char.IsDigit))
   {
       liNumeric.Add(int.Parse(new string(st.Where(char.IsDigit).ToArray()))); 
   }

 }  
 if (liNumeric.Any()) //Max will fail if you don't have items in the liNumeric
 {
     int MaxValue = liNumeric.Max();
 }

Please try the following: 请尝试以下方法:

List<string> liRoom = new List<string>() {"Room1","Room2","Room3",  
                                         "Room4","Hall","Room5","Assembly",  
                                         "Room6","Room7","Room8","Room9"};


var re = new Regex(@"\d+");

int max = liRoom.Select(_ => re.Match(_))
                .Where(_ => _.Success)
                .Max( _ => int.Parse(_.Value));

/* 
   max = 9 
*/

You should add below in your code by checking whether match is success or not 您应通过检查匹配是否成功,在代码中添加以下内容

if (varMatch.Success)
{
     liNumeric.Add(Convert.ToInt16(varMatch.Groups["Numeric"].Value));
}

You don't need foreach , it can be done with one statement: 您不需要foreach ,只需执行以下语句即可:

int value = liRoom.Where(x => x.Any(char.IsDigit))
            .Select(x => Convert.ToInt32(new String(x.Where(char.IsDigit).ToArray())))
            .Max();

It seems odd but it's working. 看起来很奇怪,但是可以正常工作。 :) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM