我正在努力撰写议程。为每个联系人显示一个小表格(这在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”文件中的所有联系人?
答案 0 :(得分:1)
当循环并读取文本文件的行时,不是立即创建“ContactCard”,而是构建某种类型的通用集合(列表,字典等)。此对象将为您提供强大的方法,如.Sort()。
在构建和排序Collection对象之后,循环并创建“ContactCard”。
这是stackoverflow详细介绍集合类型:
答案 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"));