在模式匹配后在foreach循环中填充List <t> </t>

时间:2010-01-15 18:13:41

标签: c# .net asp.net linq twitter

我对C#编程很新,需要一些帮助。

我正在尝试将我从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; }
}

然后我想在RegEx Matches循环中填充List:

    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对象提取和排序结果。但编译器实际上不会让我创建我的var tc = new List<TwitterCollection>(),因为:'System.Collections.Generic.List'不包含'origURL'的定义......即使我已经定义了它。

如果我只是编写new TwitterCollection,它不会标记错误,但之后如何在我的Linq表达式中引用它?

请帮忙!

3 个答案:

答案 0 :(得分: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对象的,而不是它们的列表,但是无论如何都没有必要修复逻辑中的这个缺陷。

答案 1 :(得分: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 :(得分: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),因为使用完整的单词而不是缩写通常没有相关的成本。

希望这很有用!