Проверка байтового массива содержит байтовый массив linq C#

Мне нужно проверить, содержит ли атрибут объекта byte[] строку. Я перепробовал все, что нашел, но Linq, кажется, довольно напряженный и не позволяет мне использовать мои собственные методы, так что есть идеи?

Я попытался преобразовать строку (Content) в байтовый массив, а затем с помощью пользовательского метода проверил, содержит ли мой атрибут объекта (x.Document) преобразованную строку (ContentBytes), но безуспешно, поскольку linq кажется, что он не позволяет использовать методы, которые он не может преобразовать в простой 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 ответа

Вот некоторый PSEUDO-код, чтобы дать представление о том, что я думаю. Я не даю никаких обещаний, что он будет компилироваться, тем более запускаться. Но это должно указать вам правильное направление для вашего первоначального вопроса.

Я объявляю 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

Что касается создания метода расширения, вот один из тех, что я сделал, чтобы было проще отслеживать ход выполнения выражения 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;
            }
        }

    }

В сравнении вы можете сделать наоборот? Я имею в виду, если вы знаете кодировку, то вы можете преобразовать x.Document в строку. Тогда сравнение строки будет очень простым.

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

Вам не нужно писать функцию расширения.

Другие вопросы по тегам