我有一个如下所示的类,它存储一个Uri对象和一个计数。我的想法是创建一个UrlPackage对象列表,以保存在拖网域时找到的链接以及找到它们的次数。问题是如何检查Uri是否已添加到列表中。
我曾经将Uri直接存储在一个列表中,因此只使用了以下内容:
linkList.Contains(Uri)
但现在我想找出UriPackage.UriObj是否存在于List中。
我认为linq是前进的方向,但不知道如何使用它。有什么想法吗?
class UrlPackage
{
private Uri _UriObj;
private int _Count;
public int Count
{
get { return _Count; }
set { _Count = value; }
}
public Uri UriObj
{
get { return _UriObj; }
set { _UriObj = value; }
}
}
答案 0 :(得分:3)
您应该使用Dictionary<Uri, int>
代替列表。
您可以按dict[uri]++
增加点数;您可以dict.ContainsKey(uri)
检查状态。
请注意,在插入新的uri之前,您需要检查状态:if (dict.ContainsKey(uri)) dict[uri]++ else dict[uri] = 1;
(因为不允许使用字典中不存在的密钥进行C ++索引)。
答案 1 :(得分:2)
尝试linkList.Any(x=>x.UriObj == uri)
更新:正如其他人所提到的,词典会更好地用于索引和存储。但是上面应该做你想要的。
答案 2 :(得分:0)
使用
Dictionary< UrlPackage, int > myList = new Dictionary< UrlPackage, int >();
如果对象存在,则递增它,如果不存在,则添加它并将int设置为1 ....
if ( myList.HasKey( item ) ) myList[ item ]++
else myList.Add(item,1);
答案 3 :(得分:0)
var objectExists =
(from i in linkList where i.Uri = uriVarible select i).Any();
答案 4 :(得分:0)
使用Find-method并使用谓词。
你会在这里找到一个富有表现力的例子:http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx
答案 5 :(得分:0)
如果你发现你做了很多dict.ContainsKey(key)
,你可能会考虑这种扩展方法。
public static TValue GetValue<TKey, TValue>(this IDictionary<TKey, TValue> source, TKey key)
{
TValue result;
return source.TryGetValue(key, out result) ? result : default(TValue);
}
并使用此功能,您可以
var dic = new Dictionary<string, int>();
dic["test"] = dic.GetValue("test") + 1;
我实际上认为C#中应该有一个泛型字典,默认情况下会有这种行为,所以你可以编写
dic["test"]++;
没有得到例外。这方面的一个例子是Ruby中的Hash类如何采用像这样的可选默认值
>> h = Hash.new(0)
>> h["test"]+=1
=> 1
>> h["test"]+=1
=> 2