假设我的数据库中有一个名为Stuff的东西,名为Id.从用户那里我得到一系列选定的Range对象(或者我是从输入中创建它们)和他们想要的ID.该结构的精简版本如下所示:
public struct Range<T> : IEquatable<Range<T>>, IEqualityComparer<Range<T>>
{
public T A;
public T B;
public Range(T a, T b)
{
A = a;
B = b;
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以有人可以得到:
var selectedRange = new List<Range<int>>
{
new Range(1, 4),
new Range(7,11),
};
Run Code Online (Sandbox Code Playgroud)
然后我想用它来创建一个谓词,只选择那些之间具有值的东西.例如,使用PredicateBuilder,我可以这样做:
var predicate = PredicateBuilder.False<Stuff>();
foreach (Range<int> r in selectedRange)
{
int a = r.A;
int b = r.B;
predicate = predicate.Or(ø => ø.Id >= a && ø.Id <= b);
}
Run Code Online (Sandbox Code Playgroud)
然后:
var stuff = datacontext.Stuffs.Where(predicate).ToList(); …Run Code Online (Sandbox Code Playgroud) 具体来说,我正在寻找类似干净的符号Collection<T>.TrueForAll/ Exists等.
编写一个foreach循环来检查每个对象上方法的返回感觉很臭,所以我希望有一个更好的Java习语.
我希望能够写出一些东西
void Start(some condition that might evaluate to either true or false) {
//function will only really start if the predicate evaluates to true
}
Run Code Online (Sandbox Code Playgroud)
我猜它必须是这样的形式:
void Start(Predicate predicate) {
}
Run Code Online (Sandbox Code Playgroud)
每当谓词评估为true或false时,如何检查Start函数内部?我对谓词的使用是否正确?
谢谢
我正在开发一个iphone应用程序,我与Group和Contact对象建立了一个简单的多对多关系.一个组可以有多个联系人,联系人可以属于多个组.
我正在尝试使用以下谓词选择特定联系人不属于的所有组.(注意:uid字段是我用来唯一标识联系人实体的字符串字段)
[NSPredicate predicateWithFormat:@"ALL contacts.uid != %@", contactUId]
Run Code Online (Sandbox Code Playgroud)
根据Apple的谓词编程指南,ALL聚合操作是有效的,但是我得到以下异常,表明这是一个不受支持的谓词:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'
Run Code Online (Sandbox Code Playgroud)
我可以使用类似的谓词来使用此谓词选择联系人已经属于的所有组,因此看起来我已正确定义了所有关系和字段.
[NSPredicate predicateWithFormat:@"ANY contacts.uid == %@", contactUId]
Run Code Online (Sandbox Code Playgroud)
在构造谓词时抛出异常,而不是在我尝试实际执行获取请求时抛出异常,因此它似乎与我使用的语法相关,而不是与Core Data支持相关.我究竟做错了什么?
所以我有一个数组(0 - n),保存我希望std :: set用于它的排序的值.数组是unsigned int cost [n].
我正在使用以下仿函数进行此排序:
struct ProxySorter {
ProxySorter(const unsigned* arr) : proxy_array(arr) {}
bool operator()(const unsigned& a, const unsigned& b) const {
return proxy_array[a] < proxy_array[b];
}
const unsigned* proxy_array;
};
Run Code Online (Sandbox Code Playgroud)
所以这就是问题......当我构建集合时,这是合法的:
std::set<unsigned, ProxySorter> node_queue = std::set<unsigned, ProxySorter>(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)
我没有错误,一切都按预期工作.但这似乎是黑客和草率.
但是,这显然是非法的:
std::set<unsigned, ProxySorter> node_queue(ProxySorter(cost));
Run Code Online (Sandbox Code Playgroud)
试图用ProxySorter(成本)构造它会导致一堆错误,为每个set成员调用说这样的东西:
错误:在node_queue中请求成员擦除,这是非类型类型std :: set <unsigned int,ProxySorter>(ProxySorter)
常规施工有什么问题?为什么作业有效?我错过了什么区别?任何帮助非常感谢,谢谢.
哦,抱歉问题的标题,我不知道该怎么称呼它.
我试图编写一个方法,尝试使用变量(作为NSXMLParser的一部分)基于谓词检索对象.代码如下所示:
我在类中定义了这些变量:
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSString *model;
@property (strong, nonatomic) NSString *element;
Run Code Online (Sandbox Code Playgroud)
现在在方法中,我设置了这样的请求:
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:self.model inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
Run Code Online (Sandbox Code Playgroud)
现在面临的挑战 - 我希望能够做到的是:
// DOES NOT WORK
[request setPredicate:[NSPredicate predicateWithFormat:@"%@ == %@", self.element,string]];
Run Code Online (Sandbox Code Playgroud)
但这并没有带来任何结果.经过一番捣乱,我注意到这确实有效:
if ( [self.element isEqualToString:@"name"] ) {
[request setPredicate:[NSPredicate predicateWithFormat:@"name == %@", string]];
}
Run Code Online (Sandbox Code Playgroud)
这告诉我,我self.element的设置是正确的(我认为?)但是谓词不喜欢表达式的左侧是变量.
我也尝试过:
[request setPredicate:[NSPredicate predicateWithFormat:@"%s == %@", [self.element UTF8String],string]];
Run Code Online (Sandbox Code Playgroud)
...只是为了看看它是否更喜欢一个字符串.我也无法做到这一点.
我正在尝试甚至可能吗?我已经尽可能多地阅读了Core Data文档,我找不到任何以这种方式执行的示例代码,但我也没有发现任何可以说它不可能的内容.
编辑:现在工作代码:
[request setPredicate:[NSPredicate …Run Code Online (Sandbox Code Playgroud) 我找到了这个引用:
- 预测纯函数.
谓词纯度:谓词是一个函数对象,它返回是/否答案,通常作为bool值.如果函数的结果仅依赖于它的参数,那么函数在数学意义上是纯粹的(请注意,这种"纯"的使用与纯虚函数无关).
不允许谓词保持或访问影响其运算符()结果的状态,包括成员和全局状态.更喜欢使operator()成为谓词的const成员函数(参见条款15).
什么是本声明中提到的纯函数,有人可以提供示例吗?提前致谢.
我正在尝试从实体框架转换为Dapper,以期提高数据访问性能.
我使用的查询是谓词形式,如"Expression>".
举个例子:
我有以下代码,我需要转换为使用Dapper.
我目前在做什么:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
// this.Context is of type DbContext
return await this.Context.Set<TModel>().Where(query).ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
我想做什么:
public async Task<List<TModel>> Get(Expression<Func<TModel, bool>> query)
{
using (IDbConnection cn = this.GetConnection)
{
return await cn.QueryAsync<TModel>(query);
}
}
Run Code Online (Sandbox Code Playgroud)
我的google-fu让我失望,有人可以帮忙.
编辑:
请注意,我找到了:https: //github.com/ryanwatson/Dapper.Extensions.Linq
但我似乎无法弄清楚如何使用它.
我正在使用Java11.学习一种新的方法Predicate.not,我发现我目前的代码只找到猫科:
List<String> animals = List.of("cat", "leopard", "dog", "lion", "horse");
Predicate<String> cats = a -> !a.equals("dog") && !a.equals("horse");
Set<String> filterCat = animals.stream().filter(cats).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)
输出是:
豹,猫,狮子
现在我正在尝试使用新方法,输出结果不正确.我该如何纠正?我做错了什么?
我后来的代码:
Predicate<String> updatedCatFilter = Predicate.not(a -> a.equals("dog") && a.equals("horse"));
Set<String> catFamily = animals.stream().filter(updatedCatFilter).collect(Collectors.toSet());
System.out.println(filterCat);
Run Code Online (Sandbox Code Playgroud)
但是现在输出我的所有列表.
马,豹,猫,狗,狮子
我想知道是否有任何方法可以转换Predicate为String.例如,将有一个功能:
public static <T> String convertPredicate(Predicate<T> objPredicate) {
return ?...
}
Run Code Online (Sandbox Code Playgroud)
以便以下调用将返回(obj) -> obj.value== 1:
convertPredicate((obj) -> obj.value== 1)
Run Code Online (Sandbox Code Playgroud) predicate ×10
c# ×3
java ×3
.net ×2
c++ ×2
core-data ×2
ios ×2
collections ×1
constructor ×1
dapper ×1
expression ×1
function ×1
generics ×1
iphone ×1
java-11 ×1
lambda ×1
linq ×1
linq-to-sql ×1
nspredicate ×1
set ×1
stl ×1
string ×1