在运行时创建字符串列表。C#

在运行时创建字符串列表。C#,c#,string,list,C#,String,List,我需要做的是在一段时间内创建一个字符串列表。项目应该做的是将输入分为两类:用户名和用户名类型。输入将类似于:johnadmin 史密斯老师 艾伦管理。 输出如下: 管理员约翰,艾伦 史密斯老师 这是我现在拥有的代码,但我不知道如何在运行时将名称添加到组中 Regex regex = new Regex(@"([A-z]{1,})\s([a-z]{1,})"); List<string> input= new List<string>();

我需要做的是在一段时间内创建一个字符串列表。项目应该做的是将输入分为两类:用户名和用户名类型。输入将类似于:johnadmin 史密斯老师 艾伦管理。
输出如下: 管理员约翰,艾伦

史密斯老师

这是我现在拥有的代码,但我不知道如何在运行时将名称添加到组中

       Regex regex = new Regex(@"([A-z]{1,})\s([a-z]{1,})");
        List<string> input= new List<string>();
        List<string> names = new List<string>();
        List<string> groups = new List<string>();

        int i =0;
        string experimentalString=null;
        Console.WriteLine("Please enter the users' names and corresponding groups seperated by a whitespace," +
            " or type sort to show results ");
        while (string.Compare(experimentalString ,"sort")!=0)
        {
            experimentalString = null; 
            experimentalString =  Console.ReadLine();
            Match match = regex.Match(experimentalString);
            if (match.Success)
            {

                input.Add(experimentalString);
                Console.WriteLine(input[i]);
            }
            else 
                throw new Exception ("invalid input format");
            //if (input[i].Equals("sort", StringComparison.OrdinalIgnoreCase))
            //{
            //    break;
            //}
            i++;  
        }
        for (int count = 0; count < input.Count-1; i++)
        {
            names.Add(input[i].Substring(0, input[i].IndexOf(' ')));

            groups.Add(input[i].Substring(input[i].IndexOf(' '), input.Count - 1));
        }
Regex Regex=newregex(@“([A-z]{1,})\s([A-z]{1,})”;
列表输入=新列表();
列表名称=新列表();
列表组=新列表();
int i=0;
字符串实验字符串=null;
WriteLine(“请输入用户名和用空格分隔的对应组,”+
“或键入排序以显示结果”);
while(string.Compare(实验字符串,“排序”)!=0)
{
实验字符串=null;
experimentalString=Console.ReadLine();
Match=regex.Match(实验字符串);
如果(匹配成功)
{
input.Add(实验字符串);
Console.WriteLine(输入[i]);
}
其他的
抛出新异常(“无效输入格式”);
//if(输入[i].Equals(“排序”,StringComparison.OrdinalIgnoreCase))
//{
//中断;
//}
i++;
}
对于(int count=0;count
使用组属性

foreach(var match in regex.Matches(inputStr).Cast<Match>())
{
    var name = match.Groups[1];
    var type = match.Groups[2];
}
然后你可以有一个用户列表

List<User> users = new List<User>();

//...

foreach(var match in regex.Matches(inputStr).Cast<Match>())
{
    var name = match.Groups[1];
    var type = match.Groups[2];

     users.Add(new User(name, type));
}
如果您想将组保存在某种集合中,我建议您使用字典

 var dictionary = groups.ToDictionary(g => g.Key, g => g.ToList());
现在,您可以使用type作为键访问相同类型的用户列表

 var teachers = dictionary["teacher"];
 var admins = dictionary["admin"];
为了在控制台中打印用户,您应该像这样逐个打印属性

Console.WriteLine($"Name: {user.Name}, Type:{user.Type}");
或者,您可以在用户类中重写ToString

// Put this method in User class
public override string ToString()
{
   return $"User Name: {Name}, User Type {Type}";
}
现在您可以轻松打印用户

  Console.WriteLine(user);

那么,在不打印重复的组名的情况下,我们如何将用户分组呢?我不知道你所说的“重复组名”是什么意思。您能详细说明一下吗?因此,如果有多个用户具有admin类型,则应将其作为admin john,smith打印到控制台。不是管理员约翰管理员史密斯谢谢,但我还有一个问题。每当我尝试执行Console.write(user)时,我都会打印出来:System.Linq.Grouping`2[System.String,ConsoleApp1.Users]这是我使用的代码var groups=Users.GroupBy(u=>u.Type);foreach(组中的var-group){Console.Write(group);//组包含具有相同类型foreach(组中的var-user){Console.Write(user+“,”);}}因为这是类的默认行为以及它们如何转换为字符串。您可以通过重写方法来更改此行为。请参阅更新
// Put this method in User class
public override string ToString()
{
   return $"User Name: {Name}, User Type {Type}";
}
  Console.WriteLine(user);