2012-07-26 107 views
0

我有2個列表集合。一個包含數字,其他名稱。有兩倍于姓名的數字(總是)。我想從集合中取出第一個名字,然後從其他集合中取出前兩個數字,然後將它們放在(VentriloUser)的第三個用戶集合中。然後第二個名字需要與第三個和第四個數字匹配等等。結合數字和名稱集合

我正在想一些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>(); 
     } 


    } 

我是一個業餘愛好者,但希望有朝一日能從事事業。任何幫助深表感謝。感謝您的時間。

回答

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])); 
} 
+0

我添加構造函數VentriloUser。我不熟悉LINQ(我寧願使用它)。我相信你的例子只顯示1個名字加1個數字。我可能錯了。 – leetbit 2012-07-26 07:25:14

+0

啊,我知道了......對不起,我以爲是2位同名用戶,但是Ping不同。這是一個用戶和2個數字(即平和秒),而不是...我要修改代碼... – digEmAll 2012-07-26 07:29:59

+0

LINQ是真棒。 – leetbit 2012-07-26 07:37:04