Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何读取特定位置文本文件中的所有行并使用数据?_C#_.net_Winforms - Fatal编程技术网

C# 如何读取特定位置文本文件中的所有行并使用数据?

C# 如何读取特定位置文本文件中的所有行并使用数据?,c#,.net,winforms,C#,.net,Winforms,我需要做的是: 每次行以ComboBox开头,然后仅从行中获取ComboBox名称,例如cmbxOption 由于我在我的表单1设计器中已经有了这个组合框,我需要确定CMBX选项的开始和结束位置,以及下一个组合框开始CMBX存储的时间 要获取当前组合框的所有行,例如,这些行属于cmbxOption: 类Win32_1394控制器 类Win32_1394控制器设备 要从每一行创建一个键和值,例如从该行创建: 类Win32_1394控制器 然后键将是Win32_1394; 1394Controlle

我需要做的是:

  • 每次行以
    ComboBox
    开头,然后仅从行中获取
    ComboBox
    名称,例如
    cmbxOption
  • 由于我在我的
    表单1
    设计器中已经有了这个
    组合框
    ,我需要确定
    CMBX选项
    的开始和结束位置,以及下一个
    组合框
    开始
    CMBX存储
    的时间

  • 要获取当前组合框的所有行,例如,这些行属于
    cmbxOption

    类Win32_1394控制器 类Win32_1394控制器设备

  • 要从每一行创建一个键和值,例如从该行创建:

    类Win32_1394控制器

  • 然后键将是Win32_1394; 1394Controller,值将仅为
    1394Controller

    然后第二行键是Win32_1394; Controller Device和value only
    1394Controller Device

  • 要仅将值
    1394Controller
    添加到正确的归属组合框中

  • 要做到这一点,当我在
    组合框中选择时,例如在
    cmbxOption
    中选择项目
    1394Controller
    时,它将像我选择的
    Win32\u 1394Controller
    一样

  • 例如,在这种情况下:

    ComboBox Name cmbxOption
    
    Classes Win32_1394Controller
    Classes Win32_1394ControllerDevice
    
    ComboBox Name cmbxStorage
    
    Classes Win32_LogicalFileSecuritySetting
    Classes Win32_TapeDrive
    
    需要时,
    SelectedItem
    将是
    Win32\u 1394Controller
    ,但用户将在
    cmbx选项中看到
    1394Controller
    ,而不使用
    Win32\u

    这是InsertInfo方法的开始

     private void cmbxOption_SelectedIndexChanged(object sender, EventArgs e)
        {
        InsertInfo(cmbxOption.SelectedItem.ToString(), reflstDisplayHardware, chkHardware.Checked);
    
        }
    

    这就是为什么我需要的密钥将是Win32_1394; Controller,但我希望用户在
    组合框中只看到
    1394Controller
    ,而没有
    Win32_

    ,下面是一些快速丑陋的代码:

      private void InsertInfo(string Key, ref ListView lst, bool DontInsertNull)
                {
    
    以及它产生的输出:

    var lines = @"ComboBox Name cmbxOption
    
    Classes Win32_1394Controller
    Classes Win32_1394ControllerDevice
    
    ComboBox Name cmbxStorage
    
    Classes Win32_LogicalFileSecuritySetting
    Classes Win32_TapeDrive".Split('\n').Select(l => l.TrimEnd('\r')).ToArray();
    
    lines.GroupByComboboxName().ForEach(g =>
    {
        Console.WriteLine(g.Key + ":");
        g.ForEach(l => Console.WriteLine("    " + l));
    });
    

    这应该能让你走了。

    太好了。到目前为止,您尝试了什么?您的具体问题是什么?stackoverflow并不是免费为您完成工作,而是帮助程序员解决特定问题。在这里添加您的努力,以表明您已经尝试了一些东西(至少)。这个地方不是雇个人来完成你的工作的。
    class Group<T> : List<T>, IGrouping<T, T>
    {
        public T Key { get; private set; }
    
        public Group(T key)
        {
            Key = key;
        }
    }
    
    static class Extensions
    {
        public static IEnumerable<IGrouping<string, string>> GroupByComboboxName(this IEnumerable<string> lines)
        {
            Group<string> group = null;
    
            foreach (var line in lines)
            {
                if (string.IsNullOrWhiteSpace(line)) continue;
    
                var parts = line.Split(' ');
                if (parts.Length == 3 && parts[0] == "ComboBox" && parts[1] == "Name")
                {
                    if (group != null) yield return group;
                    group = new Group<string>(parts[2]);
                }
                else if (group != null)
                {
                    group.Add(line);
                }
            }
    
            if (group != null) yield return group;
        } 
    }
    
    var lines = @"ComboBox Name cmbxOption
    
    Classes Win32_1394Controller
    Classes Win32_1394ControllerDevice
    
    ComboBox Name cmbxStorage
    
    Classes Win32_LogicalFileSecuritySetting
    Classes Win32_TapeDrive".Split('\n').Select(l => l.TrimEnd('\r')).ToArray();
    
    lines.GroupByComboboxName().ForEach(g =>
    {
        Console.WriteLine(g.Key + ":");
        g.ForEach(l => Console.WriteLine("    " + l));
    });
    
    cmbxOption:
        Classes Win32_1394Controller
        Classes Win32_1394ControllerDevice
    cmbxStorage:
        Classes Win32_LogicalFileSecuritySetting
        Classes Win32_TapeDrive