我有以下方法
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参数格式相同的格式来获得完全相同的值是个好主意。
答案 0 :(得分:2)
执行此操作的一个棘手方法是撤消VOICEMAIL_TYPE
字符串,使用具有最大元素数的重载来拆分字符串:
bigString
请注意,您需要再次反转拆分的字符串以获取原件
答案 1 :(得分:1)
您可以使用string.Join
将msg
的拆分部分再次组合在一起:
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);