我需要检查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);
}
有什么想法吗?
答案 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;