C#处理集合中项目检查的优雅方式

时间:2010-12-21 10:41:41

标签: c#

我在下面发布了一个代码示例。首先让我解释一下

termStore.Groups在下面的代码中是一组Group Objects(确切的类是无关紧要的)。

检查null:if(termStore.Groups [groupName] == null)似乎是一种逻辑(干净)方法,但如果Groups集合为空,则会产生异常。

使用termStore.Groups.Contains也不是一个选项,因为它需要一个强类型,即:.Contains(Group)... not .Contains(GroupName as string)

有人可以推荐一种干净/通用的方式,我可以检查一个项目是否存在于集合中。

谢谢....

TermStore termStore = session.TermStores.Where(ts => ts.Name == termStoreName).FirstOrDefault();
                if (termStore.Groups[groupName] == null)
                {
                    termStore.CreateGroup(groupName);
                    termStore.CommitAll();
                }

更新:确切的类Sharepoint Taxonomy Classes。 http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.taxonomy.group.aspx

更新2,确切的集合:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.taxonomy.groupcollection.aspx

5 个答案:

答案 0 :(得分:8)

Microsoft.SharePoint.Taxonomy.GroupCollection实现了IEnumerable<Group>,所以LINQ可能正是医生所要求的: -

if(termStore.Groups.Any(x => x.Name == "MyGroup"))
{
   // group contains at least one item matching the predicate.
}
else
{
   // group contains no items matching the predicate.
}

您需要使用.NET 3.5或更高版本并添加“using System.Linq;”到你文件的顶部。

修改

如果您没有可用的LINQ,或者它冒犯了您,或者您是否真的已经分析过,并且发现与字符串索引器相比,迭代群组会破坏性能,您可以使用GroupCollection.Count来避免错误状态: -

if (termStore.Groups.Count == 0 || termStore.Groups[groupName] == null)
{
  // Group doesn't exist.
}

答案 1 :(得分:2)

IEnumerable.Any(...)适合您的情况:

termsStore.Groups.Any()

答案 2 :(得分:1)

我认为这就是你要找的东西:

termStore.Groups.ContainsKey(groupName)

检查密钥是否存在,如果不存在则不抛出异常。这假设Groups是一个实现IDictionary的集合。

答案 3 :(得分:0)

可能是这个

termStore.Any() && termStore.Groups.Any() && termStore.Groups[groupName] == null

答案 4 :(得分:-1)

好的,第二次尝试。如果Groups不包含所需的ContainsKey方法,那么您可以自己编写。然后你可以使用ContainsKey代替Contains。

static class GroupExtensions
{
   public static bool ContainsKey(this Groups groups, string key) 
   {
      try
      {
         if(groups[key] == null)
         {
            return false;
         }
      }
      catch
      {
         return false;
      }
      return true;
   }

}