c#字符串转换成数组(使用多维数组?)我应该如何处理
本文关键字:数组 我应该 处理 何处理 转换 字符串 | 更新日期: 2023-09-27 18:25:57
新手仍在学习,几个小时以来一直试图一起搜索和破解代码,我认为有一些基本的东西我没有得到!
好吧,我有一个字符串(取自文本文件)-"user1,password,1,0;user2,password,0,0;user3,password,,0;user4,password,0,1"
我想把字符串分割成一个多维数组(我想)
userAccount[1]=
accountDetails[userName]=user1
accountDetails[password]=password
accountDetails[adminRights]=1
accountDetails[loginAttempts]=0
userAccount[2]=
accountDetails[userName]=user2
...So on and so on
为了可读性,我也想使用accountDetails的枚举,但我可以在之后使用它。
从字符串创建这个多维数组的最佳方法是什么?
非常感谢,Ross
我建议先创建一个UserAccount
类来保存数据,然后再创建List<UserAccount>
。
这比多维字符串数组要好得多,因为它是类型安全的,并且允许您将处理帐户的逻辑直接放入类中。
这本质上是一个面向对象编程的问题。
当我刚开始的时候,我也会滥用int
和string
变量。int
是用户登录的次数。string
是用户的用户名、电子邮件、名字和姓氏。。。。等等,如果我只是创建一个class
来表示这个Person的一般结构,并调用Person.NumTimesLoggedIn
、Person.FirstName
、Person.Username
、Person.Email
呢?
考虑以面向对象的方式构建数据:http://staffweb.londonmet.ac.uk/~chalkp/proj/ootutor/objects.html
正如其他人所建议的,为数据创建一个类将是比多维"数组"更好的选择。
该类可能看起来像这样:
class UserAccount
{
public string UserName { get; set; }
public string Password { get; set; }
public bool HasAdminRights { get; set; }
public int LoginAttempts { get; set; }
}
然后,您可以使用string.Split()
首先解析;
的字符串,然后在每个部分中解析,
的字符串。使用LINQ,它可能看起来像这样:
string line = …;
var users = (from userString in line.Split(';')
select userString.Split(',') into parts
select new UserAccount
{
UserName = parts[0],
Password = parts[1],
HasAdminRights = int.Parse(parts[2]) != 0,
LoginAttempts = int.Parse(parts[3])
}).ToArray();
编辑:这假设您没有将字符串作为格式提交。这是更多的工作,但您也可以做一个非XML序列化程序
更好的做法是不再编写另一个序列化程序。一些属性和一些真正通用的代码,你可能永远不必再写另一个了。请注意,这里的读写方法并不关心类型是什么,您可以将它们用于任何类。
可以在MSDN中找到XmlElement、XmlType和Serializable 的更多信息
你的班级:
[Serializable()]
[XmlType()]
public class UserAccount
{
[XmlElement()]
public string UserName { get; set; }
[XmlElement()]
public string Password { get; set; }
[XmlElement()]
public bool HasAdminRights { get; set; }
[XmlElement()]
public int LoginAttempts { get; set; }
}
写入方法:
public static void Serialize<T>(string path, string filename, T entity)
{
string fullpath = path + "''" + filename;
using (TextWriter writer = new StreamWriter(fullpath))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(writer, entity);
}
}
读取方法:
public static T Deserialize<T>(string path, string filename)
{
T result = default(T);
string fullpath = path + "''" + filename;
using (TextReader reader = new StreamReader(fullpath))
{
XmlSerializer deserializer = new XmlSerializer(typeof(T));
result = (T)deserializer.Deserialize(reader);
}
return result;
}
并且,使用这些的示例:
void XmlTest(string path, string filename)
{
List<UserAccount> accounts = new List<UserAccount>();
accounts.Add(new UserAccount() { UserName = "Admin", Password = "123", HasAdminRights = true });
accounts.Add(new UserAccount() { UserName = "Bob", Password = "password", HasAdminRights = false });
Serialize(path, filename, accounts);
List<UserAccount> accountsRead = Deserialize<List<UserAccount>>(path, filename);
}
此解决方案取决于您将读取的字符串数据是否对所有属性都具有相同的分隔,但您知道每个对象的属性数为n,在您的示例中为4。
string strTextFile = readthe file here;
string[] strArr = strTextFile.Split(new char[] { ',' });
Account[] UserAccount = new Account[strArr.length / 4];
int index = 0;
for ( int i = 0, i < strArr.length ; i = i + 4)
{
userAccount[index]= new Account();
userAccount[index].userName =strArr[i];
userAccount[index].password =strArr[i + 1];
userAccount[index].adminRights =strArr[i + 2];
userAccount[index].loginAttempts =strArr[i+ 3];
}