2013-08-01 69 views
0

是否有可能做到以下幾點,如果不是有沒有更好的方法來做我想完成的事情?創建一個班級

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

然後在後面的代碼調用它

Default.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); 
+6

你想要完成什麼樣的世界?你可以給一些背景故事嗎? –

+2

你不能拿出更好的標題嗎?創建_什麼樣的班級? –

+0

對不起,我很想嘗試創建一個類,以便能夠創建一個對象列表,然後將其綁定到數據網格。但是目前我遇到了一個問題,試圖拿出類的一部分,或者至少試圖讓它起作用 – user2593590

回答

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,你可以做的事情的描述像ShowZipCodeDisplayName。這會產生更多可讀,可理解和(最重要的)可維護的代碼。

編輯 好吧,這將是很容易:

閱讀整個平面文件到我們稱之爲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。 ..部分可以重構成一種方法,但不希望使解決方案比原來更加混亂。你知道我在做什麼?

+0

我只是展示了列表的一個例子,但我使用的列表是一個文本文件格式化的方式 – user2593590

+0

您是否可以更新您的文章與該文本文件數據的樣本?我們可以使用平面文件對象羣體。那很簡單。 –

+0

看起來完全一樣,我放在那裏,只是幾乎1000年左右 – user2593590

0

這是一個真正的評論,但我想證明一些代碼。

添加下面參數的構造函數。(如果你想添加更多的參數,像郵政編碼)

public Person(string id, string name) 
{ 
    this.ID = id; 
    this.Name = name; 
} 

編寫方法GetKeyValue您的Person類之外,可能是將其移動到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); 
} 
+0

我喜歡這樣做的方式,但有沒有一種方法做到這一點,而不使用構造函數 – user2593590

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

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(); 
+0

我現在試試這個看看它是如何工作的,非常感謝這個例子 – user2593590

相關問題