遍历正则表达式的匹配结果时,我创建了一个新的hashtag对象并将其保存到列表中。
问题是,如果我有4个#hashtags,则它的最后一个hashtag被记录4次。例如-#这个#是#一些#标签。 #hashtags将在我的列表中记录4次。如何获得所有正确标记在列表中的主题标签?
List<Hashtag> hashTags = new List<Hashtag>();
var hashTag = new Hashtag();
Regex expression = new Regex(@"([#][a-zA-Z0-9]{1})\w*");
var results = expression.Matches(model.Caption);
foreach (Match match in results)
{
hashTag.CreatedOn = DateTime.UtcNow;
hashTag.Id = Guid.NewGuid();
hashTag.Text = match.ToString();
hashTags.Add(hashTag);
}
db.Hashtags.AddRange(hashTags);
await db.SaveChangesAsync();
我的列表hashTag应该包含匹配结果中的每个单独的hashtag。
答案 0 :(得分:1)
您需要将var hashTag = new Hashtag();
行放在foreach
循环内。
答案 1 :(得分:0)
List<Hashtag> hashTags = new List<Hashtag>();
// var hashTag = new Hashtag(); remove this line move it to inside foreach
Regex expression = new Regex(@"([#][a-zA-Z0-9]{1})\w*");
var results = expression.Matches(model.Caption);
foreach (Match match in results)
{
/*Keep it here so every time a new instance of Hashtag will be created and cached in your hasTags list,
instead of updating same reference and adding it again, which causes your issue */
var hashTag = new Hashtag();
hashTag.CreatedOn = DateTime.UtcNow;
hashTag.Id = Guid.NewGuid();
hashTag.Text = match.ToString();
hashTags.Add(hashTag);
}
db.Hashtags.AddRange(hashTags);
await db.SaveChangesAsync();
答案 2 :(得分:0)
在创建HashTag
实例之前,请删除所有重复项:
string data = "#this #is #some #hashtags. #hashtags";
var tags =
Regex.Matches(data, @"#([^\W]+)")
.OfType<Match>()
.Select(m => m.Groups[1].Value)
.Distinct()
.ToList();
哪个返回如下列表:
因此,一旦理解了该概念,就可以使用Select
Linq扩展名(,因为它“投影”到了新的东西而被视为“投影”)实际上返回了{{1 }},甚至不需要List<HashTag>
循环,例如
for
如下所示:
这是根据我的回答