【问题标题】:How does LINQ contains workLINQ 包含如何工作
【发布时间】:2016-02-12 18:58:45
【问题描述】:

我了解如何使用 LINQ,因此语法在这里并不重要。 LINQ 究竟是如何相互渗透“包含”的,以及在后台发生了什么?我知道它会找到包含您要查找的单词的所有元素,但它会找到包含多个单词但未全部包含的结果吗?例如,我在数据库中有一行名称,如果我使用包含,我将能够找到我的人

Contains("James Bar") 

如果真名是James foo Bar

或者查询只是寻找

where name like '%James bar%'

不返回结果

【问题讨论】:

  • 你说的是string.Contains吗?如果是这样,那么是的,它会在传入的字符串之前和之后大致翻译成带有通配符的类似。
  • 这取决于底层 LINQ 提供程序。你在使用 LINQ to SQL 吗?
  • 我猜应该是 string.Contains 所以说得通。

标签: c# sql linq


【解决方案1】:

我们开始 --- 通过reference source 进行检查:包含具有更大相等比较的调用 IndexOf 并调用重载的 IndexOf 方法。 hth

        [Pure]
        public bool Contains( string value ) {
             return ( IndexOf(value, StringComparison.Ordinal) >=0 );
        }

        [Pure]
        public int IndexOf(String value, StringComparison comparisonType) {
            return IndexOf(value, 0, this.Length, comparisonType);
        }

        [Pure]
        [System.Security.SecuritySafeCritical]
        public int IndexOf(String value, int startIndex, int count, StringComparison comparisonType) {
            // Validate inputs
            if (value == null)
                throw new ArgumentNullException("value");

            if (startIndex < 0 || startIndex > this.Length)
                throw new ArgumentOutOfRangeException("startIndex", Environment.GetResourceString("ArgumentOutOfRange_Index"));

            if (count < 0 || startIndex > this.Length - count)
                throw new ArgumentOutOfRangeException("count", Environment.GetResourceString("ArgumentOutOfRange_Count"));
            Contract.EndContractBlock();

            switch (comparisonType) {
                case StringComparison.CurrentCulture:
                    return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);

                case StringComparison.CurrentCultureIgnoreCase:
                    return CultureInfo.CurrentCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);

                case StringComparison.InvariantCulture:
                    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.None);

                case StringComparison.InvariantCultureIgnoreCase:
                    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);

                case StringComparison.Ordinal:
                    return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.Ordinal);

                case StringComparison.OrdinalIgnoreCase:
                    if (value.IsAscii() && this.IsAscii())
                        return CultureInfo.InvariantCulture.CompareInfo.IndexOf(this, value, startIndex, count, CompareOptions.IgnoreCase);
                    else
                        return TextInfo.IndexOfStringOrdinalIgnoreCase(this, value, startIndex, count);

                default:
                    throw new ArgumentException(Environment.GetResourceString("NotSupported_StringComparison"), "comparisonType");
            }  
        }

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多