/// <summary> /// Get all tweets /// </summary> /// <param name="tweetTxtFileName"></param> /// <param name="users"></param> /// <returns></returns> public List <Tweet> GetAllTweets(string tweetTxtFileName, List <User> users) { _fileToRead = Enums.FileToRead.tweet; var lines = StringReader(tweetTxtFileName).ToList(); // Build list of tweets return(lines.Select(line => { var content = line.Substring(line.IndexOf(">", StringComparison.Ordinal) + 1, line.Length - line.IndexOf(">", StringComparison.Ordinal) - 1); var nameOfUserOfTweet = line.Substring(0, line.IndexOf(">", StringComparison.Ordinal)); var user = users.SingleOrDefault(x => x.Name.Equals(nameOfUserOfTweet));// Use SingleOrDefault as it is possible the file contains a tweet with a name of someone that isn't in the users file. So potentially null return new Tweet { Id = lines.IndexOf(line) + 1, Content = content, UserId = user?.Id ?? 0 }; }).ToList()); }
/// <summary> /// Get all users and all the followers for each user /// </summary> /// <param name="userTxtFileName"></param> /// <returns></returns> public List <User> GetUsersAndTheirFollowers(string userTxtFileName) { _fileToRead = Enums.FileToRead.user; var lines = StringReader(userTxtFileName).ToList(); // Build list of users var names = lines.SelectMany(x => x.Replace(" follows", ",").Replace(" ", "").Split(',')).Distinct().ToList(); var users = names.Select(name => new User { Id = names.IndexOf(name) + 1, Name = name }).ToList(); // Build list of followers var namesOfFollowers = lines.Select(x => x.Substring(0, x.IndexOf("follows", StringComparison.Ordinal) - 1)).Distinct().ToList(); var followers = namesOfFollowers .Select(nameOfFollower => { var linesWhereUserFollowed = lines.Where(line => line.Substring(0, line.IndexOf("follows", StringComparison.Ordinal) - 1).Equals(nameOfFollower)); var usersFollowed = linesWhereUserFollowed.SelectMany(line => line.Substring(line.IndexOf("follows", StringComparison.Ordinal) + 8, line.Length - line.IndexOf("follows", StringComparison.Ordinal) - 8).Replace(" ", "").Split(',')).Distinct().ToList(); var user = users.Single(x => x.Name.Equals(nameOfFollower)); return(new Follower { Id = namesOfFollowers.IndexOf(nameOfFollower) + 1, UserId = user.Id, Name = nameOfFollower, UserIdsFollowed = usersFollowed.Select(x => users.Single(y => y.Name.Equals(x)).Id).ToList() }); }).ToList(); // Map followers into User.Followers AddFollowerToUser(users, followers); return(users); }