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

C#处理集合中项目检查的优雅方式,c#,C#,我在下面发布了一个代码示例。首先让我解释一下 下面代码中的termStore.Groups是组对象的集合(确切的类是无关的) 检查null:if(termStore.Groups[groupName]==null)似乎是一种逻辑(干净)方法,但如果Groups集合为空,则会产生异常 使用termStore.Groups.Contains也不是一个选项,因为这需要一个强类型,即:.Contains(Group)。。。not.Contains(组名为字符串) 有人能推荐一种干净/通用的方法来检查集合

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

下面代码中的termStore.Groups是组对象的集合(确切的类是无关的)

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

使用termStore.Groups.Contains也不是一个选项,因为这需要一个强类型,即:.Contains(Group)。。。not.Contains(组名为字符串)

有人能推荐一种干净/通用的方法来检查集合中是否存在项目吗

谢谢你

TermStore termStore = session.TermStores.Where(ts => ts.Name == termStoreName).FirstOrDefault();
                if (termStore.Groups[groupName] == null)
                {
                    termStore.CreateGroup(groupName);
                    termStore.CommitAll();
                }
更新:Sharepoint分类法类的确切类别


更新2,确切的收藏:

我想这就是你想要的:

termStore.Groups.ContainsKey(groupName)

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

我认为这就是您要寻找的:

termStore.Groups.ContainsKey(groupName)

检查密钥是否存在,如果不存在,则不会引发异常。这是假设组是一个实现IDictionary的集合。

Microsoft.SharePoint.Taxonomy.GroupCollection实现了
IEnumerable
,因此一点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.
}
您需要使用.NET3.5或更高版本,并在文件顶部添加“usingsystem.Linq;”

编辑

如果您没有可用的LINQ,或者它冒犯了您,或者如果您确实分析并发现与字符串索引器相比,在组上迭代会降低性能,那么您可以使用GroupCollection.Count来避免错误状态:-

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

Microsoft.SharePoint.Taxonomy.GroupCollection实现了
IEnumerable
,因此医生可能会点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.
}
您需要使用.NET3.5或更高版本,并在文件顶部添加“usingsystem.Linq;”

编辑

如果您没有可用的LINQ,或者它冒犯了您,或者如果您确实分析并发现与字符串索引器相比,在组上迭代会降低性能,那么您可以使用GroupCollection.Count来避免错误状态:-

if (termStore.Groups.Count == 0 || termStore.Groups[groupName] == null)
{
  // Group doesn't exist.
}
应适用于您的案例:

termsStore.Groups.Any()
应适用于您的案例:

termsStore.Groups.Any()

好的,第二次尝试。如果组不包含所需的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;
   }

}

好的,第二次尝试。如果组不包含所需的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;
   }

}
可能是这个

termStore.Any() && termStore.Groups.Any() && termStore.Groups[groupName] == null
可能是这个

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


现在就开始测试。不幸的是,组(作为sharepoint对象)似乎不是从支持ContainsKey的基类型派生的。但是谢谢:)那么小组是什么课?如果您想在该类上使用方法,那么确切的类是相关的。现在就测试它。不幸的是,组(作为sharepoint对象)似乎不是从支持ContainsKey的基类型派生的。但是谢谢:)那么小组是什么课?如果您希望在该类上使用方法,则确切的类是相关的。什么类型是
?(是的,它是相关的)。@pst,检查更新,到TermStore的链接也有用吗?组类型本身可能不相关,但肯定是TermStore的类型。组非常重要!请注意,termStore.Groups的类型为Microsoft.SharePoint.Taxonomy.GroupCollection,并且确实实现了IEnumerable。@Lain-感谢您的澄清。我只是在学习LINQ,但它太棒了。什么类型的小组?(是的,它是相关的)。@pst,检查更新,到TermStore的链接也有用吗?组类型本身可能不相关,但肯定是TermStore的类型。组非常重要!请注意,termStore.Groups的类型为Microsoft.SharePoint.Taxonomy.GroupCollection,并且确实实现了IEnumerable。@Lain-感谢您的澄清。我只是在学习LINQ,但它太棒了。看看LINQ选项。谢谢。这件衣服很优雅。我看到的唯一问题是,如果组包含很多项,那么如果依赖IEnumerable(再次假设此集合是某种字典的基础),就会失去字典查找的速度。谢谢。这件衣服很优雅。我看到的唯一问题是,如果组包含很多项,那么如果使用IEnumerable(再次假设此集合是某种字典的基础),则会失去字典查找的速度。问题是,如果集合为空,则组[key]会引发异常。的确,上面的代码捕获异常并返回false。我更喜欢检查错误状态,而不是try/catch。即使没有LINQ(例如GroupCollection.Count),我们也可以这样做。问题是,如果集合为空,groups[key]会抛出异常。事实上,上面的代码捕获异常并返回false。我更喜欢检查错误状态,而不是try/catch。即使没有LINQ(例如GroupCollection.Count),我们也可以做到这一点@Tim barras:一些集合(如List)不需要任何lambda,只需要any()。当然,您可以像任何(x=>x.Field==“value”)一样自定义它(例如,如果它是L2SQL)@Tim barras:一些集合(如List)不需要任何lambda,只需要Any()。但当然,您可以自定义它(例如,如果它是L2SQL),就像任何(x=>x.Field==“value”)Microsoft.SharePoint.Taxonomy.TermStore本身并没有实现IEnumerable一样。@Iain Galloway,我不知道这一点。我认为它是一个普通的对象。Microsoft.SharePoint.Taxonomy.TermStore本身并没有实现IEnumerable。@Iain Galloway,我没有意识到这一点。我以为那是个普通的东西。