【问题标题】:IList.Contains(string[]) how to in C#?IList.Contains(string[]) 如何在 C# 中使用?
【发布时间】:2013-02-25 13:11:08
【问题描述】:

我正在寻找一种使用字符串数组参数调用 IList.Contains 的快速方法

有没有办法做到这一点:

val[] = {"first", "second"}

var temp = from i in items
           where i.list.Contains(val)
           select i;

【问题讨论】:

标签: c# linq


【解决方案1】:

如果您想检查i.list 是否包含任一 "first""second"

var val = new [] { "first", "second" };
var temp = from i in items
           where val.Any (i.list.Contains)
           select i;

如果您想检查i.list 是否包含两者 "first""second"

var val = new [] { "first", "second" };
var temp = from i in items
           where val.All (i.list.Contains)
           select i;

但是,如果性能至关重要(考虑在循环中调用数百个项目),则使用 HashSetintersection as advised by Hermit 会更合适。

【讨论】:

  • 任何声明都是我想要的。非常感谢。
【解决方案2】:
var temp = from i in items
           where i.list.Any(x => val.Contains(x)) 
           select i;

如果所有列表项都应该在值中,则使用All

【讨论】:

    【解决方案3】:

    我真的不擅长 LINQ,所以我不打算解决这个问题。

    首先在列表上执行包含并不是最快的事情。在列表上执行 LINQ 并不能让它更快。你需要做的是有一个 HashSet,然后做一个 Contains。如果你有两个列表,我会说创建两个 HashSet 并将它们相交。

    http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx

    【讨论】:

      【解决方案4】:

      不确定“包含”是什么意思,如果您想要所有匹配的项目,@lazyberezovsky 的答案应该是正确的。

      但是,如果您想覆盖 IList.Contains 以支持数组(或 Enumerable),您可以这样做:

          /// <summary>
          /// Return true if <paramref name="allItems"/>
          /// contains one or more <paramref name="candidates"/>
          /// </summary>
          public static bool Contains<T>(IList<T> allItems, IEnumerable<T> candidates)
          {
              if (null == allItems)
                  return false;
      
              if (null == candidates)
                  return false;
      
              return allItems.Any(i => candidates.Contains(i));
          }
      

      【讨论】:

        【解决方案5】:

        这是一个扩展方法,用于获取数组中的任何项目是否存在于列表中。这个返回一个bool,比如IList.Contains

        public static class IListExtensions
        {
            public static bool ContainsAny<T>(this IList<T> list, IEnumerable<T> enumerable)
            {
                foreach (var item in enumerable)
                {
                    if (list.Contains(item))
                        return true;
                }
                return false;
            }
        }
        

        用法:

        IList<int> a = // ...
        string[] b = // ...
        
        a.ContainsAny(b);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-30
          • 1970-01-01
          • 2019-09-29
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多