2013-12-10 61 views
0

我正在嘗試編寫一個議程。爲每個聯繫人顯示一個小表格(這在MDI父表格中)。用我當前的代碼,所有聯繫人都寫入文件;我呈現信息的方式,一次顯示所有聯繫人(這肯定不會吸引最終用戶)。C#讀取文本文件內容並按字母順序拆分

當然,我需要按字母順序呈現聯繫人。文件每一行中的第一個字段是聯繫人姓,這可以幫助我排序。這位新手卡住的地方在於,如何根據姓氏的第一個字母來提取線條,這樣我就可以在真正的議程中呈現信息?

我看到別人的問題,答案是子列表和「分組」功能。但是沒有解釋代碼,那麼這對我來說就像是中國人。

我在想也許我的「所有聯繫人文件」分成基於姓的第一個字母的小文件(但這將是太多的小文件,也許不是一個好的做法?)。如果這不是一個壞主意,那麼如何實現?

我創建了一個「Person」類。而與此代碼,我添加新聯繫人:

private void btn_CM_addNew_Click(object sender, EventArgs e) 
{ 
    _contact.FirstName = txt_CM_name.Text; 
    _contact.LastName = txt_CM_lastName.Text; 
    //Person.lista.Add(_contact); 
    StreamWriter file = new StreamWriter("C:\\CA_Contacs.txt", true); 
    file.WriteLine(_contact.ToString()); 
    file.Close(); 
    this.Close(); 
} 

有了這個代碼,我顯示「聯繫卡」:

if ((new FileInfo("C:\\CA_Contacs.txt").Exists == true)) 
{ 
    var reader = new StreamReader(File.OpenRead("C:\\CA_Contacs.txt")); 
    while (!reader.EndOfStream) 
    { 
     Person _contact = new Person(); 
     var line = reader.ReadLine(); 
     var attributes = line.Split(','); 
     _contact.LastName = attributes[0]; 
     _contact.FirstName = attributes[1]; 

     ContactCard contactCardItem = new ContactCard(); 
     contactCardItem.MdiParent = this; 
     contactCardItem.Text = _contact.LastName + ", " + _contact.FirstName; 
     contactCardItem.Contact = _contact; 
     contactCardItem.Show(); 
     this.LayoutMdi(MdiLayout.TileVertical); 
    } 
} 

你有什麼建議給接觸什麼方法可以按字母順序顯示?

換句話說,如何從文件中提取所有以「A」或「a」開頭的行,將所有這些行放入自己的組中(列表,子列表,文件,其他結構),所以我以後可以只提供該組,而不是「CA_Contacs.txt」文件中的所有聯繫人?

回答

1

看一看LINQ,它是這樣的事情很厲害。我建議你不僅要複製和粘貼,而且要真正瞭解這些行的含義。

這行代碼會給你你需要的東西:

var contacts = from contact in (from ele in File.ReadAllLines(@"C:\\your.file") 
       // local variable with the splitted name 
       let name = line.Split(',') 
       // Get a new Person-object 
       select new Person(){ LastName = name[0], FirstName = name[1] }) 
       // Group the Person-objects by the first letter of their last name 
       group contact by contact.LastName.First() into g 
       // Order them by their "key", ie A, B, C instead of random order. 
       order by g.Key 
       // Return the grouping we have created 
       select g; 

您可以使用它像這樣:

foreach (var contactGroup in contacts) { 
    var header = contactGroup.Key; // ie 'A', 'B' etc 
    // do something with header 
    foreach (var contact in contactGroup) 
    { 
    // do something with contact (a Person-type instance) 
    } 
} 
+0

感謝您的詳細解釋。我將首先理解你提出的代碼的作用,然後將其集成到我的項目中:) – DMS

+0

嗨,菜鳥問題:如何定義密鑰? – DMS

+0

@DMS這行:通過contact.LastName.First()將contact組中的所有聯繫人組聯繫到由contact.LastName.First()(即鍵)定義的組中,這是否有意義? – flindeberg

1

在循環讀取文本文件的行時,不是立即創建'ContactCard',而是構建某種類型的List(Dictionary,Dictionary等)的泛型集合。該對象將爲您提供強大的方法,如.Sort()。

在您的Collection對象被構建和排序後,循環並創建您的'ContactCard'。

下面是詳細計算器Collection類型:

Where can I learn about the various types of .NET lists?

+0

謝謝博TX,我會試試這個。 – DMS

0

除了博TX」回答:

具有內置您的收藏後,您可以使用LINQ查詢它,E。 Q值。

using System.Linq; 
..... 


IEnumerable<ContactCard> contacts = ...; 

充滿=>對象建立/(見上文)

IEnumerable<ContactCard> contactsWithA = contacts.Where(cc => cc.LastName.ToLower().StartsWith("a")); 
+0

謝謝macrobbsen,當然這會很有用。 – DMS

相關問題