0

是否可以执行以下操作,如果没有,是否有更好的方法来完成我想要完成的事情?

个人.cs

    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;
    }
    }

然后在后面的代码中这样称呼它

默认.aspx.cs

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);
4

3 回答 3

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
    }
};

第二个选项具有智能感知,如果存在无效条目,则会在编译时中断。它看起来不那么聪明,而且打字更多(也许),但这种方式更不容易出错。

现在,您可以遍历您的人员列表,而不是执行一些通用操作,例如Assign,您可以执行描述性操作,例如ShowZipCodeor 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... 部分可以重构为一个方法,但不想使解决方案变得比它必须的更混乱。你明白我在做什么的要点吗?

于 2013-08-01T20:56:15.017 回答
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);
}
于 2013-08-01T20:56:52.507 回答
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();
于 2013-08-01T20:58:13.833 回答