C#读取文本文件内容并按字母顺序拆分

时间:2013-12-10 16:02:28

标签: c# list class file-io

我正在努力撰写议程。为每个联系人显示一个小表格(这在MDI父表格中)。使用我当前的代码,所有联系人都被写入文件;我呈现信息的方式,一次显示所有联系人(这当然不会吸引最终用户)。

我当然需要按字母顺序提供联系人。文件每行中的第一个字段是联系人姓氏,可以帮助我排序。这个菜鸟被困的地方是,如何根据姓氏的第一个字母提取线条,以便我可以在真实议程中提供信息?

我看到了其他人的问题,答案是子列表和“分组”功能。但是没有对代码的解释,那对我来说就像中文一样。

我在考虑将我的“所有联系人文件”拆分成基于姓氏首字母的小文件(但这可能是太多小文件,也许不是一个好习惯?)。如果这不是一个坏主意,怎么可能完成?

我创建了一个类“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”文件中的所有联系人?

3 个答案:

答案 0 :(得分:1)

当循环并读取文本文件的行时,不是立即创建“ContactCard”,而是构建某种类型的通用集合(列表,字典等)。此对象将为您提供强大的方法,如.Sort()。

在构建和排序Collection对象之后,循环并创建“ContactCard”。

这是stackoverflow详细介绍集合类型:

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

答案 1 :(得分: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)
  }
}

答案 2 :(得分:0)

除了Bo TX的回答:

构建完集合后,可以使用Linq查询它,例如: Q值。

using System.Linq;
.....


IEnumerable<ContactCard> contacts = ...;

=&GT;对象构建/填充(见上文)

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