如何将c#中的字符串除以子字符串

时间:2016-03-10 17:18:57

标签: c# .net

我有以下方法

 public void DivideIntoSubStrings(string msg, string methodName, string  userId)
 {   
    string st = String.Format("{0}.{1}.{2}", msg, methodName, userId);
    DoSomething(st);
 }

当我在上面的方法中调用以下方法并希望获得msg,methodName和userId参数时

 public void DoSomething(string bigString)
 {
       string st1 = bigString;
       string[] st2 = st1.Split('.');
       string t1 = st2[st2.Length - 1];
       string t2 = st2[st2.Length - 2];
       Console.WriteLine(t1);
       Console.WriteLine(t2);

 }

我总是确保获得methodName和userId,因为它们被传递到DivideIntoSubString(....)方法,但msg是一个消息参数,可以输入任何内容或换句话说我不知道​​格式之前的msg字符串,因为它将在运行时传递。它可以有逗号,句号,下划线等。因此,使用与运行时传递的msg参数格式相同的格式来获得完全相同的值是个好主意。

4 个答案:

答案 0 :(得分:2)

执行此操作的一个棘手方法是撤消VOICEMAIL_TYPE字符串,使用具有最大元素数的重载来拆分字符串:

bigString

请注意,您需要再次反转拆分的字符串以获取原件

答案 1 :(得分:1)

您可以使用string.Joinmsg的拆分部分再次组合在一起:

public void DoSomething(string bigString)
{
   string st1 = bigString;
   string[] st2 = st1.Split('.');
   string t1 = st2[st2.Length - 1];
   string t2 = st2[st2.Length - 2];

   string msg = string.Join(".", st2.Take(st2.Length-2));    

   Console.WriteLine(t1);
   Console.WriteLine(t2);
   Console.WriteLine(msg);
}    

LINQ方法Take返回仅代表st2.Length-2的第一个st2元素的序列。
string.Join通过用句点再次分隔它们来连接该序列中的所有字符串。

答案 2 :(得分:0)

请尝试以下代码:

public static void DivideIntoSubStrings(string msg, string methodName, string userId)
{
    string lengths = String.Format("{0}%{1}%{2}", msg.Length, methodName.Length, userId.Length);
    string st = String.Format("{0}.{1}.{2}.{3}", lengths, msg, methodName, userId);
    DoSomething(st);
}

public static void DoSomething(string bigString)
{ 
    string lengthsString = bigString.Split('.').ElementAt(0);
    List<string> lengthsStringArray = lengthsString.Split('%').ToList();
    List<int> lengthIntArray = new List<int>();
    for (int i=0; i < lengthsStringArray.Count; i++)
    {
        lengthIntArray.Add(int.Parse(lengthsStringArray.ElementAt(i))); 
    }
    string msg = bigString.Substring(lengthsString.Length + 1, lengthIntArray.ElementAt(0));
    string methodName = bigString.Substring(lengthsString.Length + msg.Length + 2, lengthIntArray.ElementAt(1));
    string userId = bigString.Substring(lengthsString.Length + msg.Length + methodName.Length + 3, lengthIntArray.ElementAt(2));

    Console.WriteLine(msg);
    Console.WriteLine(methodName);
    Console.WriteLine(userId);
}

你需要知道字符串长度,然后你可以把它保存在你传递的字符串中。 这样你就不会关心你选择的连接字符了!

答案 3 :(得分:0)

我认为这应该被修改。

public void DivideIntoSubStrings(string msg, string methodName, string  userId)
{   
   string[] st = new string[3] { msg, methodName, userId };
   DoSomething(st);
}

public void DoSomething(string[] params)
{

}

或者您可以将其作为Tuple<string, string, string>传递。或者,如果您不想存储在一个变量中,只需将msg,methodName和userId作为三个参数传递给您的方法。没有理由将所有内容连接起来,只是立即将其拆分。

但是,如果真的想要这样做......

如果没有人可以传入新行(例如,来源是单行文本框),我建议您使用{0}\r\n{1}\r\n{2}作为格式,而不是像.这样全球化的内容吗? / p>

然后你可以使用

bigString.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);