【问题标题】:Trying to add a search feature based on a tab delimited file [closed]尝试添加基于制表符分隔文件的搜索功能 [关闭]
【发布时间】:2017-09-05 18:51:26
【问题描述】:

每个星期一我都会收到一个导出的地址簿...我的老板想要一个程序来访问这些信息。是的,有很多方法是有意义的(比如将其导入 Outlook),但我们正在走独立应用程序的路线。我无法控制当前作为“制表符”分隔文件到达的传入文件(信息或格式)。我的代码完全按照它目前的设计目的。但是,我想添加一个搜索功能,但我不知道是否可以以我现在拥有的形式进行,或者是否需要更改我导入信息的方式。

标签文件进来(名称(Fisrt_Last)、部门、职务、电子邮件、OfficePH、MobilePH)。

我正在解析文件,并创建一个数组列表。我希望能够按姓氏搜索。这可能吗?还是我完全走错了路?

public Form1()
{
    InitializeComponent();

    //for (int i = 0; i < Program.contacts.Length; i++)
    //{
    //    listView1.Items.Add(Program.contacts.ElementAt(i).ToString());
    //}

    string name, department, title, emailAddress, officePhone, mobilePhone;
    ArrayList contacts = new ArrayList();

    using (GenericParser parser = new GenericParser())
    {
        parser.SetDataSource("S:/DEPARTMENTS/INFO_TECH/PERM/short_cuts/Addressbook.txt");
        parser.ColumnDelimiter = '\t';
        parser.FirstRowHasHeader = true;
        parser.SkipStartingDataRows = 0;
        parser.MaxRows = 15000;
        parser.TextQualifier = '\"';

        while (parser.Read())
        {
            name = parser["Name"];
            department = parser["Department"];
            title = parser["Title"];
            emailAddress = parser["EmailAddress"];
            officePhone = parser["OfficePhone"];
            mobilePhone = parser["MobilePhone"];

            contacts.Add(new contact(name, department, title, emailAddress, officePhone, mobilePhone));
        }

        listBox1.DataSource = contacts;
        listBox1.DisplayMember = "CName";
    }
}

private void listBox1_DoubleClick(object sender, EventArgs e)
{
    string n = ((contact)listBox1.SelectedItem).CName;
    string d = ((contact)listBox1.SelectedItem).CDept;
    string t = ((contact)listBox1.SelectedItem).CTitle;
    string em = ((contact)listBox1.SelectedItem).CEmail;
    string o = ((contact)listBox1.SelectedItem).COPhone;
    string m = ((contact)listBox1.SelectedItem).CMPhone;

    textBox1.Text = n;
    textBox2.Text = d;
    textBox3.Text = t;
    textBox4.Text = em;
    textBox5.Text = o;
    textBox6.Text = m;
}

【问题讨论】:

标签: c# parsing search


【解决方案1】:

首先,我将创建一个Contact 类。这是您的简化版本,只有姓名和部门。

public class Contact
{
    public string Name { get; set; }
    public string Department { get; set; }
}

然后我会将阅读部分分开并将其放入一个方法中。而不是ArrayList,只需使用System.Collections.List,如下所示:

public static void ReadContacts(out List<Contact> contacts)
{
    contacts = new List<Contact>();
    using (GenericParser parser = new GenericParser())
    {
        parser.SetDataSource("S:/DEPARTMENTS/INFO_TECH/PERM/short_cuts/Addressbook.txt");
        parser.ColumnDelimiter = '\t';
        parser.FirstRowHasHeader = true;
        parser.SkipStartingDataRows = 0;
        parser.MaxRows = 15000;
        parser.TextQualifier = '\"';

        while (parser.Read())
        {
            contacts.Add(new Contact() { Name = parser["Name"], Department = parser["Department"] });
        }
    }
}

现在,如果您想使用LINQ 搜索生成的列表,我会执行以下操作。这是假设一个名字的例子看起来像Jane_Doe(这是我从你的例子中理解的)。

List<Contact> contacts = null;
ReadContacts(out contacts);

listBox1.DataSource = contacts;
listBox1.DisplayMember = "CName";

string searchName = "Doe";
var result = contacts.Where(x => x.Name.Split('_')[1] == searchName);

【讨论】:

  • 我已经有了联系人类。谢谢你的视觉。我想我去吧。试一试后我会回来的。
  • 不客气。根据您的 Name 的实际外观,您可能需要更改您的 Where() 搜索模式。
  • 我不会依赖拆分名称字符串并按索引访问名称,因为这很容易受到错误输入的影响。考虑简单地使用string.Contains
  • @ironstone13 好建议。让我更新答案。
  • 不过,再想一想,OP 想要通过 Last Name 搜索,如果 First Name 包含搜索字符串但 Last Name 不包含,Contains() 将失败。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 2015-02-21
  • 2012-06-18
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
相关资源
最近更新 更多