从包含信息的字符串创建具有初始化属性的对象列表

asf*_*991 9 c# string class list object

我有一个看起来像这样的字符串:

random text 12234
another random text 

User infos: 

User name : John
ID : 221223
Date : 23.02.2018
Job: job1

User name : Andrew
ID : 378292
Date : 12.08.2017
Job: job2

User name : Chris
ID : 930712
Date : 05.11.2016
Job : job3

some random text
Run Code Online (Sandbox Code Playgroud)

而这堂课:

class User
{
   public string UserName { get; set; }
   public string ID { get; set; }
   public string Date { get; set; }
   public string Job { get; set; }
   public User(string _UserName, string _ID, string _Date, string _Job)
   {
       UserName = _UserName
       ID = _ID;
       Date = _Date;
       Job = _Job;
   }
}
Run Code Online (Sandbox Code Playgroud)

我想用该字符串创建一个包含信息的用户列表.

我试过这样做:

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

    string Data = (the data above)
    string[] lines = Data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

    List<string> UserNames = new List<string>();
    List<string> IDs = new List<string>();
    List<string> Dates = new List<string>();
    List<string> Jobs = new List<string>();

    foreach (var line in lines)
    {
        if (line.StartsWith("User name : "))
        {
            UserNames.Add(Line.Remove(0, 12));                 
        }

        if (Line.StartsWith("ID : "))
        {
            IDs.Add(Line.Remove(0, 5));
        }

        if (Line.StartsWith("Date : "))
        {
           Dates.Add(Line.Remove(0, 7));
        }

        if (Line.StartsWith("Job : "))
        {
           Jobs.Add(Line.Remove(0, 6));
        }        
    }
    var AllData = UserNames.Zip(IDs, (u, i) => new { UserName = u, ID = i });

    foreach (var data in AllData)
    {
        Users.Add(new User(data.UserName, data.ID, "date", "job"));
    }
Run Code Online (Sandbox Code Playgroud)

但我只能使用此代码组合两个列表.此外,我为每个用户提供了4个以上的值(上面的字符串只是一个简短的例子).

有更好的方法吗?谢谢.

Mon*_*Zhu 8

因为它似乎总是4行信息,你可以4通过分裂数组的循环步骤lines.在每一步中,您将按冒号分割:并收集最后一项,这是所需的值:

编辑:在这种情况下,我会建议寻找数据的START.

int startIndex = Data.IndexOf("User name");
Run Code Online (Sandbox Code Playgroud)

编辑2:

也以另一行文字结尾

然后你可以使用LastIndexOf来查找重要信息的结尾:

int endIndex = Data.LastIndexOf("Job");
int lengthOfLastLine = Data.Substring(endIndex).IndexOf(Environment.NewLine);
endIndex += lengthOfLastLine;
Run Code Online (Sandbox Code Playgroud)

然后简单地从startindex中取一个SubString直到结束

string [] lines = Data.Substring(startIndex, endIndex - startIndex)
                     .Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
List<User> allUsers = new List<UserQuery.User>();

for (int i = 0; i < lines.Length; i += 4)
{
    string name = lines[i].Split(':').Last().Trim();
    string ID   = lines[i + 1].Split(':').Last().Trim();
    string Date = lines[i + 2].Split(':').Last().Trim();
    string Job  = lines[i + 3].Split(':').Last().Trim();
    allUsers.Add(new User(name, ID, Date, Job));
}
Run Code Online (Sandbox Code Playgroud)

啊,你应该Trim把空间带走.该解决方案应该是可读的.4在我的解决方案中,硬编码的步长实际上很烦人

免责声明:只有格式不变,此解决方案才有效.如果行的顺序应该改变,它将返回错误的结果