结合数字和名称集合

时间:2012-07-26 06:59:17

标签: c# c#-4.0 .net-4.0

我有2个列表集合。一个包含数字,其他名称。数字的名称是(总是)的两倍。我想从集合中获取第一个名称,然后从另一个集合中获取前两个数字,然后将它们放在第三个用户集合(VentriloUser)中。然后第二个名称需要与第3和第4个数字匹配,依此类推。

我正在考虑使用for或foreach循环,但我现在无法绕过它。

public class VentriloUser
    {
        public VentriloUser(string name, int seconds, int ping)
        {
            Name = name; Seconds = seconds; Ping = ping;
        }
        public string Name { get; set; }
        public int Ping { get; set; }
        public int Seconds { get; set; }
    }

public class Ventrilo
    {
        public Ventrilo(string statusurl)
        {
            StatusURL = statusurl;
        }

        public string StatusURL { get; set; }

        public string HTML { get; set; }

        public List<VentriloUser> Users { get; set; }

        private Regex findNumbers = new Regex("\\<td width=\"10%\" bgcolor=\"#\\w{6}\"\\>\\<font color=\"#000000\">\\<div style=\"overflow:hidden;text-overflow:ellipsis\"\\>-?\\d+\\<");
        private Regex findNames = new Regex("\\<td width=\"20%\" bgcolor=\"#\\w{6}\"\\>\\<font color=\"#000000\">\\<div style=\"overflow:hidden;text-overflow:ellipsis\"\\>\\b\\w+\\<");

        private WebClient wClient = new WebClient();

        public void DownloadHTML()
        {
            HTML = wClient.DownloadString(StatusURL);
        }

        public List<int> GetNumbers()
        {
            var rawnumbers = findNumbers.Matches(HTML);
            var numbers = new List<int>();

            foreach (var rawnumber in rawnumbers)
            {
                var match = Regex.Match(rawnumber.ToString(), "\\>\\-?\\d+\\<");

                string number = Regex.Replace(match.ToString(), "\\<|\\>", "");

                numbers.Add(Convert.ToInt32(number));
            }

            return numbers;
        }
        public List<string> GetNames()
        {
            var rawnames = findNames.Matches(HTML);
            var names = new List<string>();

            foreach (var rawname in rawnames)
            {
                var match = Regex.Match(rawname.ToString(), "\\>\\w+<");

                string name = Regex.Replace(match.ToString(), "\\<|\\>", "");

                names.Add(name);
            }

            return names;
        }

        public List<VentriloUser> GenerateUsers()
        {
            var numbers = GetNumbers();
            var names = GetNames();

            var users = new List<VentriloUser>();
        }


    }

我是一个爱好者,但希望有一天能够追求事业。任何帮助深表感谢。谢谢你的时间。

1 个答案:

答案 0 :(得分:3)

使用LINQ:

var users = names.Select((name,idx) => new VentriloUser(name, numbers[idx*2], numbers[idx*2+1]))
                 .ToList();

使用循环:

var users = new List<VentriloUser>();
for (int i = 0; i < names.Count; i++)
{
    var name = names[i];
    int j = i * 2;
    if (j >= numbers.Count - 1)
        break; // to be safe...
    users.Add(new VentriloUser(name, numbers[j], numbers[j + 1]));
}