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

时间:2017-10-22 05:20:26

标签: c# string list

我需要做什么我一次创建一个字符串列表。该项目应该做的是将输入分为两类,用户名和用户类型。输入将类似于:john admin 史密斯老师 艾伦管理员。
输出将是这样的: admin john,allen。

老师史密斯

这是我现在的代码,但我无法弄清楚如何在运行时将名称添加到组中。

       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));
        }

1 个答案:

答案 0 :(得分:1)

使用Groups属性。

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

你还需要使用一个类,你不应该使用sperate列表。

public class User
{
    public User(string name, string type)
    {
        Name = name;
        Type = type;
    }

    public string Name { get; }
    public string Type { get; }
}

然后你可以有用户列表。

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));
}

如果您想按类型对用户进行分组,请使用Linq扩展方法&#34; GroupBy&#34;。

var groups = users.GroupBy(u => u.Type);

 foreach(var group in groups)
 {
     // group contains all users with same type
     foreach(var user in group)
     {
          //...
     }
 }

如果你想在某种集合中保存组,我建议你使用Dictionary。

 var dictionary = groups.ToDictionary(g => g.Key, g => g.ToList());

现在,您可以使用类型作为键来访问具有相同类型的用户列表。

 var teachers = dictionary["teacher"];
 var admins = dictionary["admin"];

要在控制台中打印用户,您应该逐个打印属性。

Console.WriteLine($"Name: {user.Name}, Type:{user.Type}");

或者,您可以在User类中覆盖ToString。

// Put this method in User class
public override string ToString()
{
   return $"User Name: {Name}, User Type {Type}";
}

现在您可以轻松打印用户

  Console.WriteLine(user);