2010-01-15 57 views
4

我對C#編程還很陌生,需要一些幫助。模式匹配後在foreach循環中填充列表<T>

我想將我從JSON提要收集的值分配給我自己的類型,其中我定義了將JSON元素放入的某些字段(屬性)的類,以及從RegEx派生的元素模式匹配過程。這將允許我使用LINQ訪問對象,因爲我使用List來保存我的對象。

我的代碼中存在一個foreach循環,用於循環查找每個匹配的RegEx方法。我只對JSON提要中存在匹配的部分感興趣。

所以我自己定義的類是這樣的:

//simple field definition class 
public class TwitterCollection 
{ 
    public string origURL { get; set; } 
    public string txtDesc { get; set; } 
    public string imgURL { get; set; } 
    public string userName { get; set; } 
    public string createdAt { get; set; } 
} 

然後我想在正則表達式來填充列表匹配循環:

foreach (Match match in matches) 
    { 

     GroupCollection groups = match.Groups; 
     var tc = new List<TwitterCollection>() 
     { 
      origURL = groups[0].Value.ToString(), 
      txtDesc = res.text, 
      imgUrl = res.profile_image_url, 
      userName = res.from_user_id, 
      createdAt = res.created_at, 

     }; 
    } 

然後,該代碼將繼續提取和排序結果通過Linq到Objects。但編譯器實際上不會讓我創建var tc = new List<TwitterCollection>(),因爲:'System.Collections.Generic.List'不包含'origURL'的定義...即使我已經定義了它。

它不會標記一個錯誤,如果我只是寫new TwitterCollection但我怎麼在我的Linq表達式中引用這個?

請幫忙!

+0

你爲什麼使用JSON API?爲什麼不使用XML? – 2010-01-15 18:25:15

+0

JSON的開銷較小(顯然)? 事情是...我已經使用了下面提供的解決方案,但是爲什麼現在無處不在說TwitterCollection ... ???看起來很奇怪 – Alex 2010-01-15 18:28:44

回答

8

您需要實例外循環列表:

var list = new List<TwitterCollection>(); 
foreach (Match match in matches) 
{ 

    GroupCollection groups = match.Groups; 
    var tc = new TwitterCollection 
    { 
     origURL = groups[0].Value.ToString(), 
     txtDesc = res.text, 
     imgUrl = res.profile_image_url, 
     userName = res.from_user_id, 
     createdAt = res.created_at, 
    }; 
    list.Add(tc); 
} 

此刻,你正在試圖創建的每個元素的新列表。實際的編譯錯誤是因爲你的對象初始化對象是一個TwitterCollection對象,而不是它們的列表,但是無論如何,在邏輯中這個缺陷沒有意義。

+0

非常感謝,錯誤消失了...但是...我在實際網頁上的結果只有名稱TwitterCollection的每個URL!任何想法,爲什麼這可能是?非常感激!! – Alex 2010-01-15 18:25:50

+0

您需要重寫Group類中的ToString方法,並讓它返回所需的值。默認情況下,ToString方法將始終返回該類的完全限定名稱。 – Kwal 2010-01-15 21:24:07

+0

@Matt - 這不是OP的Group類 - 它是一個正則表達式組! – 2010-01-15 21:29:10

3

問題是您正嘗試使用對象初始值設定項來處理TwitterCollection對象,但是您將它應用於List<TwitterCollection>。你想要做的是預先創建列表並調用Add,而不是每次重新創建它。

var list = new List<TwitterCollection>(); 
foreach (Match match in matches) 
{ 

    GroupCollection groups = match.Groups; 
    var tc = new TwitterCollection() 
    { 
     origURL = groups[0].Value.ToString(), 
     txtDesc = res.text, 
     imgUrl = res.profile_image_url, 
     userName = res.from_user_id, 
     createdAt = res.created_at, 

    }; 
    list.Add(tc); 
} 

或者,如果你只想LINQ查詢

var list = matches 
    .Cast<Match>() 
    .Select(x => new TwitterCollection() { 
      origURL = x.Groups[0].Value.ToString(), 
      txtDesc = res.text, 
      imgUrl = res.profile_image_url, 
      userName = res.from_user_id, 
      createdAt = res.created_at }) 
    .ToList(); 
2

題外話,但是既然你提到你是新來的C#,我想我會提到,你應該考慮以下微軟的命名指南:

http://msdn.microsoft.com/en-us/library/fzcth91k%28VS.71%29.aspx

類聲明將成爲:

public class TwitterCollection 
{ 
    public string OrignalUrl { get; set; } 
    public string TextDescription { get; set; } 
    public string ImageUrl { get; set; } 
    public string UserName { get; set; } 
    public string CreatedAt { get; set; } 
} 

鏈接中未提及的另一件事情是,在大多數情況下,匈牙利符號(例如txtDesc)只能用於少數情況。除非使用縮寫詞,否則不要使用縮寫詞(例如Url),因爲通常不會使用完整的詞而不是縮寫詞。

希望這是有用的!