C# 按项的子部分对字符串列表进行分组

C# 按项的子部分对字符串列表进行分组,c#,C#,很抱歉标题不明确。。。 我发现解释我的问题很困难-如果你需要了解更多,请告诉我 我有一个列表,我想按字符串的一部分进行分组。 此字符串也在列表中。 这是完整的列表,不是静态的,将包含不同的值 CookieMaker_TransportSettingsManual CookieMaker_TransportSettingsParameters Cookie_WrapperSettings Cookie_WrapperSettingsManual Cookie_WrapperSettingsPara

很抱歉标题不明确。。。 我发现解释我的问题很困难-如果你需要了解更多,请告诉我

我有一个列表,我想按字符串的一部分进行分组。 此字符串也在列表中。 这是完整的列表,不是静态的,将包含不同的值

CookieMaker_TransportSettingsManual
CookieMaker_TransportSettingsParameters
Cookie_WrapperSettings
Cookie_WrapperSettingsManual
Cookie_WrapperSettingsParameters
Cookie_ProfileBendSettings
Cookie_ProfileBendSettingsParameters
Cookie_HopperSettings
Cookie_HopperSettingsManual
Cookie_HopperSettingsParameters
Cookie_CutterSettings
Cookie_CutterSettingsManual
Cookie_CutterSettingsParameters
General_SpeedSetting
General_SpeedSettingManual
General_SpeedSettingSettings
General_CalibrationSettings
General_CalibrationSettingsCalibration
Bonbon_Vertical
Bonbon_VerticalAligner
Bonbon_VerticalHopper
Bonbon_VerticalManual
Bonbon_VerticalTransporter
Bonbon_Horizontal
Bonbon_HorizontalHopper
Bonbon_HorizontalManual
Bonbon_HorizontalCookie
Bonbon_HorizontalTransporter
Bonbon_Bonbon
Bonbon_BonbonExhaust
Bonbon_BonbonManual
Bonbon_BonbonSection1
Bonbon_BonbonSection2
Bonbon_BonbonSection3
Bonbon_Compensator
Bonbon_CompensatorCarriage
Bonbon_CompensatorHopper
Bonbon_CompensatorManual
Bonbon_CollectingUnit
Bonbon_CollectingUnitManual
Bonbon_CollectingUnitTransporter
Bonbon_CollectingUnitTubeMaker
CookieMaker_TransportSettings
CookieMaker_TransportSettingsBonbon
CookieMaker_TransportSettingsPandora
预期结果将是这样的一组:

General_SpeedSetting
  ==> General_SpeedSettingManual
  ==> General_SpeedSettingSettings

Cookie_WrapperSettings
  ==> Cookie_WrapperSettingsManual
  ==> Cookie_WrapperSettingsParameters
结果数据类型并不重要。 我也不介意林克

编码/摆弄以快速启动和运行

使用系统;
公共课程
{
公共静态void Main()
{
变量输入字符串="CookieMaker_-TransportSetting手动CookieMaker_-TransportSetting参数Cookie_-Wrapper设置Cookie_-Wrapper设置手动Cookie_-Wrapper设置参数Cookie_-Wrapper设置参数Cookie_-Wrapper设置手动|曲奇切割器设置参数|通用|速度设置|通用|速度设置手动|通用|校准设置|通用|校准设置|邦邦|垂直对齐器|邦邦|垂直料斗|邦邦|垂直手动|邦邦|垂直输送机|邦邦|水平|邦邦|水平料斗|邦尼佐ntalManual | Bonbon | u HorizontalCookie | Bonbon | Bonbon | Bonbon | u Bonbon | Bonbon | bon | bon | u水平运输车| bonbonbon bon bon | bon bon bon bon bon bon u bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon废气排气| bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bon bonnitTransporter | Bonbon |收集NitTubeMaker | CookieMaker |运输设置| CookieMaker |运输设置Bonbon | CookieMaker |运输设置Spandora |;
var inputList=inputString.Split(“|”);
var result=inputList;//此处编码;)
foreach(结果中的var)
{Console.WriteLine(r);}
}
}

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
  
         static void Main(string[] args)
         {
             List<string> lines = File.ReadLines(FILENAME).ToList();
             lines = lines.OrderBy(x => x).ToList();

             List<Group> groups = new List<Group>();
             Group group = new Group();
             groups.Add(group);
             group.basename = lines[0].Trim();
             List<List<string>> results = new List<List<string>>();
             for (int i = 2; i < lines.Count; i++)
             {
                 string line = lines[i].Trim();
                 if (!line.StartsWith(group.basename))
                 {
                     group = new Group();
                     groups.Add(group);
                     group.basename = line;
                 }
                 else
                 {
                     if(group.values == null) group.values = new List<string>();
                     group.values.Add(line.Substring(group.basename.Length));
                 }
             }
 
         }
    }
    public class Group
    {
        public string basename { get; set; }
        public List<string> values { get; set; }
    }

  
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.txt”;
静态void Main(字符串[]参数)
{
列表行=File.ReadLines(FILENAME.ToList();
lines=lines.OrderBy(x=>x.ToList();
列表组=新列表();
组=新组();
组。添加(组);
group.basename=行[0]。Trim();
列表结果=新列表();
对于(int i=2;i
尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
  
         static void Main(string[] args)
         {
             List<string> lines = File.ReadLines(FILENAME).ToList();
             lines = lines.OrderBy(x => x).ToList();

             List<Group> groups = new List<Group>();
             Group group = new Group();
             groups.Add(group);
             group.basename = lines[0].Trim();
             List<List<string>> results = new List<List<string>>();
             for (int i = 2; i < lines.Count; i++)
             {
                 string line = lines[i].Trim();
                 if (!line.StartsWith(group.basename))
                 {
                     group = new Group();
                     groups.Add(group);
                     group.basename = line;
                 }
                 else
                 {
                     if(group.values == null) group.values = new List<string>();
                     group.values.Add(line.Substring(group.basename.Length));
                 }
             }
 
         }
    }
    public class Group
    {
        public string basename { get; set; }
        public List<string> values { get; set; }
    }

  
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串文件名=@“c:\temp\test.txt”;
静态void Main(字符串[]参数)
{
列表行=File.ReadLines(FILENAME.ToList();
lines=lines.OrderBy(x=>x.ToList();
列表组=新列表();
组=新组();
组。添加(组);
group.basename=行[0]。Trim();
列表结果=新列表();
对于(int i=2;i
像这样的东西怎么样

    using System;
    using System.Collections.Generic;
    using System.Linq;
                        
    public class Program
    {
        static List<string> myList = new List<string>(){
            "CookieMaker_TransportSettingsManual",
            "CookieMaker_TransportSettingsParameters",
            "Cookie_WrapperSettings",
            "Cookie_WrapperSettingsManual",
            "Cookie_WrapperSettingsParameters",
            "Cookie_ProfileBendSettings",
            "Cookie_ProfileBendSettingsParameters",
            "Cookie_HopperSettings",
            "Cookie_HopperSettingsManual",
            "Cookie_HopperSettingsParameters",
            "Cookie_CutterSettings",
            "Cookie_CutterSettingsManual",
            "Cookie_CutterSettingsParameters",
            "General_SpeedSetting",
            "General_SpeedSettingManual",
            "General_SpeedSettingSettings",
            "General_CalibrationSettings",
            "General_CalibrationSettingsCalibration",
            "Bonbon_Vertical",
            "Bonbon_VerticalAligner",
            "Bonbon_VerticalHopper",
            "Bonbon_VerticalManual",
            "Bonbon_VerticalTransporter",
            "Bonbon_Horizontal",
            "Bonbon_HorizontalHopper",
            "Bonbon_HorizontalManual",
            "Bonbon_HorizontalCookie",
            "Bonbon_HorizontalTransporter",
            "Bonbon_Bonbon",
            "Bonbon_BonbonExhaust",
            "Bonbon_BonbonManual",
            "Bonbon_BonbonSection1",
            "Bonbon_BonbonSection2",
            "Bonbon_BonbonSection3",
            "Bonbon_Compensator",
            "Bonbon_CompensatorCarriage",
            "Bonbon_CompensatorHopper",
            "Bonbon_CompensatorManual",
            "Bonbon_CollectingUnit",
            "Bonbon_CollectingUnitManual",
            "Bonbon_CollectingUnitTransporter",
            "Bonbon_CollectingUnitTubeMaker",
            "CookieMaker_TransportSettings",
            "CookieMaker_TransportSettingsBonbon",
            "CookieMaker_TransportSettingsPandora"
        };
        
        static Dictionary<string, List<string>> results = new Dictionary<string, List<string>>();
        
        //-------------------------------------------------------------------------//
        
        public static void Main()
        {
            
            var orderedList = myList.OrderBy(i=>i).ToList();    
            
            int i = 0;      
            while(i < myList.Count){
            
                var prefix = orderedList[i];
                
                results[prefix] = new List<string>();
                
                if(++i >= orderedList.Count) break;
                            
                while(orderedList[i].StartsWith(prefix)){
                        
                    results[prefix].Add(orderedList[i]);
                    i++;
                    
                    if(i >= orderedList.Count) {                    
                        Print();
                        return;
                    }
                    
                }//while
                
            }//while
            
            Print();
            
        }//main
        
        //-------------------------------------------------------------------------//
        
        private static void Print(){
            foreach (string prefix in results.Keys)
            {
                Console.WriteLine($"Prefix =>{prefix} - {results[prefix].Count}");
                    foreach (string result in results[prefix])
                    {
                        Console.WriteLine($" ======>{result}");
                    }//foreach;
            }//foreach
        }//Print
        

    }//Cls
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
静态列表myList=新列表(){
“CookieMaker_运输设置手册”,
“CookieMaker_运输设置参数”,
“Cookie_包装器设置”,
“Cookie_包装设置手动”,
“Cookie_包装设置参数”,
“Cookie_ProfileBendSettings”,
“Cookie_ProfileBendSettingsParameters”,
“Cookie_Hoppertings”,
“饼干每年一次”,
“Cookie_hopperstingsparameters”,
“Cookie_CutterSettings”,
“饼干切割器设置手册”,
“Cookie_CutterSettings参数”,
“一般设置”,
“通用速度设置手册”,
“常规\u速度设置”,
“一般校准设置”,
“常规校准设置校准”,
“Bonbon_垂直”,
“Bonbon_垂直对齐器”,
“Bonbon_VerticalHopper”,
“Bonbon_VerticalManual”,
“Bonbon_垂直运输车”,
“邦邦水平”,
“Bonbon_Hopper”,
“邦博
Bonbon_BonbonSection1
Bonbon_BonbonSection2
Bonbon_BonbonSection3
 //get all the strings from somewhere 
 var inputStrings = File.ReadAllLines("DataFile.txt");

 string lastTitle = null;
 var results = new Dictionary<string, List<string>>();
 string veryLastItem = string.Empty;

 var currentItems = new List<string>();
 for (var i = 0; i < inputStrings.Length - 1; ++i)
 {
     var commonPrefix = FindLongestCommonPrefix(inputStrings[i], inputStrings[i + 1]);
     if (string.IsNullOrEmpty(commonPrefix) || (!string.IsNullOrEmpty(lastTitle) && commonPrefix != lastTitle))
     {
         if (string.IsNullOrEmpty(lastTitle))
         {
             throw new Exception("This isn't going to work - you need to have at least two common things in a row");
         }
         if (inputStrings[i].StartsWith(lastTitle) && inputStrings[i] != lastTitle)
         {
             currentItems.Add(inputStrings[i]);
         }
         AddResultsToDictionary(results, lastTitle, currentItems);
         currentItems = new List<string>();
     }

     if (commonPrefix != inputStrings[i] &&
         ((commonPrefix == lastTitle && commonPrefix != inputStrings[i]) ||
          (!string.IsNullOrEmpty(commonPrefix) && inputStrings[i].StartsWith(commonPrefix))))
     {
         currentItems.Add(inputStrings[i]);
     }

     lastTitle = commonPrefix;
     veryLastItem = inputStrings[i + 1];
 }

 //ok, we're out of the loop:
 //add the last item to the current list
 currentItems.Add(veryLastItem);

 //and add the last set of items to the dictionary
 if (lastTitle != null)
 {
     AddResultsToDictionary(results, lastTitle, currentItems);
 }

 foreach (var result in results)
 {
     Debug.WriteLine(result.Key);
     foreach (var item in result.Value)
     {
         Debug.WriteLine($"  ==> {item}");
     }
 }

 void AddResultsToDictionary(Dictionary<string, List<string>> dictionary, string s, List<string> list)
 {
     if (dictionary.TryGetValue(s, out var existingList))
     {
         existingList.AddRange(list);
     }
     else
     {
         dictionary.Add(s, list);
     }
 }
private string FindLongestCommonPrefix(string s1, string s2)
{
    var minLen = Math.Min(s1.Length, s2.Length);
    for (var i = 0; i < minLen; ++i)
    {
        if (s1[i] != s2[i])
        {
            if (i == 0)
            {
                return string.Empty;
            }
            else
            {
                //if the common part is not s1, we need to find the last place where the following
                //   the last letter of the common part is a lower case letter followed by either
                //   an underscore or a capital letter
                if (i == s1.Length)
                {
                    return s1;
                }

                if (s1[i] == '_' || s1[i - 1] == '_' || s2[i] == '_' || s2[i - 1] == '_')
                {
                    return string.Empty;
                }

                for (var j = i; j > 0; --j)
                {
                    if (char.IsLower(s1[j-1]) && (char.IsUpper(s1[j]) /*|| s1[j] == '_'*/))
                    {
                        return s1.Substring(0, j);
                    }
                }
                //I shouldn't get here, but, if I do
                return string.Empty;
            }
        }
    }
    //otherwise
    return s1.Substring(0, minLen);
}
CookieMaker_TransportSettings
  ==> CookieMaker_TransportSettingsManual
  ==> CookieMaker_TransportSettingsParameters
  ==> CookieMaker_TransportSettingsBonbon
  ==> CookieMaker_TransportSettingsPandora
Cookie_WrapperSettings
  ==> Cookie_WrapperSettingsManual
  ==> Cookie_WrapperSettingsParameters
Cookie_ProfileBendSettings
  ==> Cookie_ProfileBendSettingsParameters
Cookie_HopperSettings
  ==> Cookie_HopperSettingsManual
  ==> Cookie_HopperSettingsParameters
Cookie_CutterSettings
  ==> Cookie_CutterSettingsManual
  ==> Cookie_CutterSettingsParameters
General_SpeedSetting
  ==> General_SpeedSettingManual
  ==> General_SpeedSettingSettings
General_CalibrationSettings
  ==> General_CalibrationSettingsCalibration
Bonbon_Vertical
  ==> Bonbon_VerticalAligner
  ==> Bonbon_VerticalHopper
  ==> Bonbon_VerticalManual
  ==> Bonbon_VerticalTransporter
Bonbon_Horizontal
  ==> Bonbon_HorizontalHopper
  ==> Bonbon_HorizontalManual
  ==> Bonbon_HorizontalCookie
  ==> Bonbon_HorizontalTransporter
Bonbon_Bonbon
  ==> Bonbon_BonbonExhaust
  ==> Bonbon_BonbonManual
  ==> Bonbon_BonbonSection1
  ==> Bonbon_BonbonSection2
  ==> Bonbon_BonbonSection3
Bonbon_Compensator
  ==> Bonbon_CompensatorCarriage
  ==> Bonbon_CompensatorHopper
  ==> Bonbon_CompensatorManual
Bonbon_CollectingUnit
  ==> Bonbon_CollectingUnitManual
  ==> Bonbon_CollectingUnitTransporter
  ==> Bonbon_CollectingUnitTubeMaker