检查字节数组包含字节数组linq c#

时间:2017-11-09 16:12:04

标签: linq entity contains

我需要检查byte []实体属性是否包含字符串。我尝试了所有我发现的东西,但Linq似乎非常紧张,并且不允许我使用我的自定义方法,所以任何想法?

我尝试将字符串(Content)转换为字节数组,然后使用自定义方法检查我的实体属性(x.Document)是否包含转换后的字符串(ContentBytes)但由于linq没有成功,似乎它没有' t允许你使用它无法转换为纯SQL的方法,所以我不知道如何获得它。

using (GPC container = new GPC()) {
    var p = from t in ... 
        select t;
        if (Content != null) {
            byte[] ContentBytes = System.Text.Encoding.ASCII.GetBytes(Content);
            p = p.Where(x => this.CheckPatternInArray(x.Document, ContentBytes) == true);
        }

private bool CheckPatternInArray(byte[] array, byte[] pattern) {
    int fidx = 0;
    int result = Array.FindIndex(array, 0, array.Length, (byte b) => {
        fidx = (b == pattern[fidx]) ? fidx + 1 : 0;
        return (fidx == pattern.Length);
    });
    return (result >= pattern.Length - 1);
}

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

这是一些 PSEUDO-CODE 来了解我在想什么。我没有承诺会编译,更不用说了。但它应该指出你正确的问题。

我声明了4个数组;一个具有我们想要检查的值,以及三个测试数组。然后我针对每个数组运行表达式以显示输出结果。

char[] toCheck = {'a', 'b', 'c', 'd'};

char[] hasAll = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
char[] hasSome = {'c', 'd', 'e', 'f', 'g'};
char[] hasNone = {'e', 'f', 'g'};

// verify the linq expression works by comparing against the different arrays
char[] foundList = toCheck.Except(v => hasAll.indexOf(v) >= 0);
// foundList.count == 0

foundList = toCheck.Except(v => hasSome.indexOf(v) >= 0);
// foundList.count == 2

foundList = toCheck.Except(v => hasNone.indexOf(v) >= 0);
// foundList.count == 0

答案 1 :(得分:0)

在比较中,您可以采取其他方式吗?我的意思是,如果您知道编码,那么您可以将x.Document转换为字符串。然后比较字符串将非常容易。

System.Text.UTF8Encoding enc = new System.Text.UTF8Encoding();
string s = enc.GetString(x.Document);

您不需要编写扩展功能。

答案 2 :(得分:0)

至于创建扩展方法,我这样做是为了更容易检查linq表达式的进度:



    public static class LinqUtilities
    {
        /// <summary>
        ///     Inject this in your Linq chains to inspect each item as it is processed.  
        ///     
        ///     The item can be changed during the "tap" operation, but a new item cannot be created
        ///     
        ///     Use this for logging or for in-line audits (summaries, secondary list creation...) or anything else that catches your fancy!
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="this"></param>
        /// <param name="tapper">function to observe the current object</param>
        /// <returns></returns>
        public static IEnumerable<T> Tap<T>(this IEnumerable<T> @this, Action<T> tapper)
        {
            foreach (var item in @this)
            {
                tapper(item);
                yield return item;
            }
        }

    }
&#13;
&#13;
&#13;