我对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表达式中引用它?
请帮忙!
答案 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),因为使用完整的单词而不是缩写通常没有相关的成本。
希望这很有用!