在论坛答了字符串分割的求助以后,第二天,那位求助者又问另一种字符串怎么分割,接着又给我短信问我第三种怎么分割。
我一想,这不是工厂模式嘛。有三种不同的需要分割的模式,用工厂模式,就能实现输入字符串即分割成需要的数据,而不用考虑格式问题。看来我的工厂模式基本熟练了。
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace Date12241
... {
/**//// <summary>
/// 基本上,如果还有别的格式,可以自己添加继承子类
/// </summary>
public class SpiltStringNew
...{
protected string originalString;
public string GetOriginalString
...{
get ...{ return originalString; }
set ...{ originalString = value; }
}
protected string changedString;
public string GetChangedString
...{
get ...{ return changedString; }
set ...{ changedString = value; }
}
public ArrayList SpiltStr()
...{
string str = changedString;
ArrayList list = new ArrayList();
string str1 = "";
foreach (char c in str)
...{
if (c != '|')
...{
str1 += c.ToString();
}
else if (str1 != "")
...{
list.Add(str1);
str1 = "";
}
}
list.Add(str1);
return list;
}
public void SecondSpilt(string str, out string name, out string gender, out int age)
...{
int indexA = str.IndexOf("a");
int indexB = str.IndexOf("b");
name = str.Substring(0, indexA);
gender = str.Substring(indexA + 1, indexB - indexA - 1);
age = Int32.Parse(str.Substring(indexB + 1, str.Length - indexB - 1));
}
public virtual ArrayList FirstSpilt()
...{
ArrayList list = new ArrayList();
return list;
}
}
//标准分割:三a男b15 ¦ ¦李四a女b15
public class StandardFirstSpilt : SpiltStringNew
...{
public override ArrayList FirstSpilt()
...{
changedString = originalString;
ArrayList list = SpiltStr();
return list;
}
}
//“姓名张三性别男年龄15姓名李四性别女年龄15”中文切割记号的分割
public class ChineseFirstSpilt : SpiltStringNew
...{
public override ArrayList FirstSpilt()
...{
changedString = originalString.Replace("姓名", "||");
changedString = changedString.Replace("性别", "a");
changedString = changedString.Replace("年龄", "b");
ArrayList list = SpiltStr();
return list;
}
}
//张三a男b20李四a男b25钱五a女b18,没有“|”符号的切割。
public class NoMarkFirstSpilt : SpiltStringNew
...{
public override ArrayList FirstSpilt()
...{
string str1 = "";
ArrayList list = new ArrayList();
int ct = originalString.Length;
for (int i = 0; i < originalString.Length; i++)
...{
str1 += originalString[i];
if ((i == ct - 1)||Char.IsDigit(originalString, i)&&(!Char.IsDigit(originalString, i + 1)) )
...{
list.Add(str1);
str1 = "";
}
}
return list;
}
}
//工厂,选择哪种分割模式
public static class SpiltStringFactory
...{
public static SpiltStringNew CreateSpilt(string str)
...{
SpiltStringNew firstSpilt = null;
bool mark = false;
bool latter = false;
foreach (char c in str)
...{
if (c == '|')
mark = true;
else if (c == 'a')
...{
latter = true;
}
}
if (mark)
...{
firstSpilt = new StandardFirstSpilt();
}
else if (latter)
...{
firstSpilt = new NoMarkFirstSpilt();
}
else
...{
firstSpilt = new ChineseFirstSpilt();
}
firstSpilt.GetOriginalString = str;
return firstSpilt;
}
}
public class test
...{
public static void Main(String[] args)
...{
//这里可以用读取数据的方法代替。
string str = "姓名张三性别男年龄15姓名李四性别女年龄15";
SpiltStringNew spiltString = SpiltStringFactory.CreateSpilt(str);
ArrayList list = spiltString.FirstSpilt();
string name;
string gender;
int age;
foreach (object obj in list)
...{
//数据彻底分离
spiltString.SecondSpilt(obj.ToString(), out name, out gender, out age);
//打印。这里可以插入将name,gender,age,插入数据库的方法。
Console.WriteLine(name + " " + gender + " " + age);
}
Console.ReadLine();
}
}
}