Проверка байтового массива содержит байтовый массив 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);
Вам не нужно писать функцию расширения.