我对C#编程很陌生,而且我被困在我的小ASP.NET项目中。
我的网站目前正在检查网址的Twitter状态,然后通过正则表达式模式匹配程序将这些网址添加到数组中。显然,不止一个人会使用特定的URL更新a,因此我不想列出重复项,我想计算特定URL的提及次数,例如100条推文。
现在我有一个List<String>
我可以排序,以便所有重复的网址彼此相邻。我的印象是我可以将list[i]
与list[i+1]
进行比较,如果匹配,则将计数器添加到(count ++),如果它们不匹配,则为URL和要计算要添加到新数组的值,假设这是重复项的结尾。
这将删除重复项,并为我计算每个URL的出现次数。目前,我所拥有的不起作用,我不知道为什么(就像我说的那样,我对这一切都不是很有经验)。
使用下面的代码,假设已使用srchResponse.results
中的关键字搜索了JSON Feed。其中包含URL的结果会添加到sList
,这是一个字符串列表类型,它只包含URL,而不是整个消息。
我想将每个URL中的一个(没有重复项),一个计数整数(到字符串)用于URL的出现次数,以及用户名,消息和用户图像URL全部放入我的锯齿状数组中,称为“urls” [100] []”。我已经将数组排成100行以确保一切都能够适合但通常,这太大了。每个'行'将包含5个元素。
调试器卡在了一行:if (sList[i] == sList[i + 1])
这是我的想法的关键,所以显然逻辑不起作用。任何建议或任何事情都将受到重视!
以下是示例代码:
var sList = new ArrayList();
string[][] urls = new string[100][];
int ctr = 0;
int j = 1;
foreach (Result res in srchResponse.results)
{
string content = res.text;
string pattern = @"((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)";
MatchCollection matches = Regex.Matches(content, pattern);
foreach (Match match in matches)
{
GroupCollection groups = match.Groups;
sList.Add(groups[0].Value.ToString());
}
}
sList.Sort();
foreach (Result res in srchResponse.results)
{
for (int i = 0; i < 100; i++)
{
if (sList[i] == sList[i + 1])
{
j++;
}
else
{
urls[ctr][0] = sList[i].ToString();
urls[ctr][1] = j.ToString();
urls[ctr][2] = res.text;
urls[ctr][3] = res.from_user;
urls[ctr][4] = res.profile_image_url;
ctr++;
j = 1;
}
}
}
然后代码继续使用HTML将每个结果添加到StringBuilder方法中。
现在是edite
答案 0 :(得分:8)
您的算法的描述似乎很好。我不知道实施有什么问题;我没有仔细阅读过。 (您使用ArrayList的事实是一个直接的红旗;为什么您不使用更强类型的泛型集合?)
但是,我有一个建议。这正是LINQ打算解决的问题。不要自己编写所有容易出错的代码,只需描述您感兴趣的转换,然后让编译器为您解决。
假设您有一个字符串列表,并且您希望确定每个字符串的出现次数:
var notes = new []{ "Do", "Fa", "La", "So", "Mi", "Do", "Re" };
var counts = from note in notes
group note by note into g
select new { Note = g.Key, Count = g.Count() }
foreach(var count in counts)
Console.WriteLine("Note {0} occurs {1} times.", count.Note, count.Count);
我希望您同意的内容比您编写的所有数组逻辑更容易阅读。当然,现在你有了一系列独特的物品;你有一系列的计数,每个计数都包含一个独特的笔记。
答案 1 :(得分:1)
我建议使用比数组更复杂的数据结构。套装将保证您没有重复。
看起来C#集合不包含Set,但有第三方实现可用,例如this one。
答案 2 :(得分:0)
您的循环失败,因为当i == 99,(i + 1)== 100时,它超出了数组的范围。
但正如其他人所指出的那样,.Net 3.5可以更优雅地做你想做的事。
答案 3 :(得分:0)
如果您不需要知道特定条目有多少重复项,则可以执行以下操作:
LINQ扩展方法
.Count()
.Distinct()
.Count()