搜索列表以检查子对象是否已存在

时间:2010-03-02 20:54:30

标签: .net linq list

我有一个如下所示的类,它存储一个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; }
        }
    }

6 个答案:

答案 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