是否可以执行以下操作,如果没有,是否有更好的方法来完成我想要完成的任务?
public class Person
{
public string ID { get; set; }
public string Name { get; set; }
public string Zip { get; set; }
public Person()
{
}
我想做这个部分,所以我可以动态地调用基于列表所在部分的方法,我不确定是否有更好的方法。
public void Assign(string k, string v)
{
k = v;
}
public string getKeyValue(string k, int w, char d)
{
string[] value = k.Split(d);
int i = 0;
foreach (string part in value)
{
if (i == w)
{
k = part;
}
i++;
}
return k;
}
}
然后在代码后面调用它就像这样
List<string> initList = new List<string>
{
"ID = 1", "Name = this is a test", "Zip = 5","ID = 2", "Name = this is a second test", "Zip = 10"
};
List<object> myList = new List<object>();
Person prs = new Person();
foreach (string txt in initList)
{
string key = prs.getKeyValue(txt,0,'=');
string val = prs.getKeyValue(txt,1,'=');
prs.Assign(key,val);
}
myList.Add(prs);
答案 0 :(得分:0)
在考虑了一些之后,我认为你认为传递字符串是一种更好的分配方式:
List<string> initList = new List<string>
{
"ID = 1", "Name = this is a test", "Zip = 5","ID = 2", "Name = this is a second test", "Zip = 10"
};
这样做有什么问题:
var people = new List<Person>()
{
new Person()
{
ID=1,
Name="this is a test",
Zip=5
},
new Person()
{
ID=2,
Name="this is a second test",
Zip=10
}
};
第二个选项具有intellisense,如果存在无效条目,则在编译时中断。它看起来并不聪明,还有更多的打字(可能),但这种方式更不容易出错。
现在,您可以遍历您的人员列表,而不是像Assign
那样执行一些通用操作,您可以执行ShowZipCode
或DisplayName
等描述性操作。这将导致更易读,易懂和(最重要的)可维护代码。
修改的 好的,这很容易:
将整个平面文件读入我们称之为flatFileData
的字符串。
然后使用逗号分隔它:
var arrayOfProperties = flatFileData.Split(',');
现在,嵌套循环以三个方式读取数据(因为你有三个属性):
var people=new List<Person>();
for(int i=0;i<arrayOfProperties.Length;i=i+3)
{
var rawId=arrayOfProperties[i];
var rawName=arrayOfProperties[i+1];
var rawZip=arrayOfProperties[i+2];
// Get the data out of the raw entry
var id=rawId.Substring(rawId.LastIndexOf('=')).Trim();
var name=rawName.Substring(rawName.LastIndexOf('=')).Trim();
var zip=rawZip.Substring(rawZip.LastIndexOf('=')).Trim();
// Make a constructor for Person that takes these values
people.Add(new Person(id,name,zip));
}
rawId.Substring ...部分可以重构为一个方法,但不想让解决方案比以前更麻烦。你明白我在做什么吗?
答案 1 :(得分:0)
这是一个评论,但我想展示一些代码。
添加一个带有以下参数的构造函数。(如果你愿意,可以添加更多参数,如zipcode)
public Person(string id, string name)
{
this.ID = id;
this.Name = name;
}
在Person类之外编写方法GetKeyValue,可以将其移动到Default.aspx.cs
&安培;在foreach循环中调用它
Person prs;
foreach (string txt in initList)
{
string key = GetKeyValue(txt,0,'=');
string val = GetKeyValue(txt,1,'=');
prs = new Person(key, val);
myList.Add(prs);
}
答案 2 :(得分:0)
你试图这样做的方式非常可怕;因为有很多可能的错误。这是一个非常hacky和容易出错的方式...但它会让你知道如何用反射做到这一点......
List<string> initList = new List<string>
{
"ID = 1",
"Name = this is a test",
"Zip = 5",
"ID = 2",
"Name = this is a second test",
"Zip = 10"
};
List<Person> list = new List<Person>();
Person person = null;
Type type = typeof(Person);
foreach (var str in initList)
{
var pair = str.Split('=').Select(s => s.Trim()).ToArray();
if (pair[0] == "ID")
{
person = new Person();
list.Add(person);
}
if (person != null)
{
PropertyInfo property = type.GetProperty(pair[0]);
if (property != null)
property.SetValue(person, pair[1]);
}
}
foreach (var item in list)
Console.WriteLine(item.ID);
Console.ReadLine();