我有一个带有两个重载的方法,如下所示:
bool Evaluate(Func<bool> condition)
{
// Some logic
return condition.Invoke();
}
bool Evaluate<T>(Func<T, bool> condition, T value)
{
// Same logic as the first method overload
return condition.Invoke(value);
}
Run Code Online (Sandbox Code Playgroud)
由于两个方法重载都包含大致相同的逻辑,我希望将它们链接在一起,但我看不到如何做到这一点.我想第一个方法overoad需要构造一个委托,它传递给第二个重载,但是不清楚这个委托应采取什么形式.
非常感谢你的建议,
蒂姆
我有一个NSString query,其中包含~10个字符.
我想检查一下,调用的第二个NSString是否word包含所有字符query或某些字符,但没有其他未指定的字符query.
此外,如果查询中只出现一个字符,则该字中只能出现一个字符.
请问你能告诉我怎么做吗?
NSString *query = @"ABCDEFJAKSUSHFKLAFIE";
NSString *word = @"fearing"; //would pass as NO as there is no 'n' in the query var.
Run Code Online (Sandbox Code Playgroud) 我有一个 PredicateBuilder,它是从http://www.albahari.com/nutshell/predicatebuilder.aspx得到的
这是我如何使用它:
var Expression = PredicateBuilder.True<UCM_UserAgent>();
Expression = Expression.And(item => item.AgentText == "TestUserAgent Value");
Func<UCM_UserAgent, bool> SearchCriteria = Expression.Compile();
var Data = Context.UCM_UserAgent
.Where(SearchCriteria)
.ToList();
Run Code Online (Sandbox Code Playgroud)
当我在我的数据库上检查 SQL Profiler 时:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[AgentText] AS [AgentText],
FROM [dbo].[UCM_UserAgent] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)
现在,我添加的条件在哪里?我无法解决这个问题。不幸的是,这个Entity Framework 和 Predicate Builder - Predicates are Ignored in SQL Query也没有帮助。
编辑:消除任何误解;我不想使用 x => x.AgentText = "SomeText"。因为我想构建一个动态的 LINQ 查询,所以我使用了 PredicateBuilder。
在阅读Java 8中引入的新功能的同时,我发现了Predicates的概念.我注意到互联网和书籍中提供的大多数示例都使用静态函数来创建谓词.
以下面的Apple类为例:
public class Apple {
private String color;
private int weight;
private static final int SMALL_APPLE_MAX_WEIGHT = 150;
public Apple(String color, int weight) {
this.color = color;
this.weight = weight;
}
public static boolean isGreenApple(Apple apple) {
return null!=apple && null!=apple.getColor() && "green".equals(apple.getColor());
}
public boolean isBigApple() {
return this.getWeight() > SMALL_APPLE_MAX_WEIGHT;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在可以创建一个新的谓词如下:
Predicate<Apple> isGreenApple = Apple::isGreenApple;
Predicate<Apple> isBigApple = Apple::isBigApple;
Run Code Online (Sandbox Code Playgroud)
如上所示,我可以使用静态和实例方法创建谓词.哪种方法是首选方法,为什么?
我对 R 比较陌生,如果这是基础知识,我很抱歉。我有这个循环,里面有一个条件,可以在 2 个列表之间进行比较,并返回一个 TRUE/FALSE 值向量。我真正需要检查的是这个向量是否只包含 TRUE 值(意味着 2 个列表是相同的)
for ( i in 1:(length(sessions_items_list)-1)){
if (sessions_items_list[[i]]==sessions_items_list[[i+1]]){
identical_sessions_df [i,1] <- names(sessions_items_list[i])
identical_sessions_df [i,2] <- names(sessions_items_list[i+1])
#identical_sessions_df [i,3] <- sessions_items_list[[i]]
#identical_sessions_df [i,4] <- sessions_items_list[[i+1]]
}
}
Run Code Online (Sandbox Code Playgroud)
这是一些数据:
> sessions_items_list[[2]]
[1] "111502665618" "111505397996" "121238758674" "121480200508" "131159477858" "161469302097" "161474935929" "171526802604" "231197187139" "231381216285" "251502101205" "261650031415"
[13] "261652085962" "261652452940" "271538491767" "281398254987" "291227243345" "311065441334" "321561638226" "321566237993" "331042848072" "331251405185" "331366646532" "361096154736"
[25] "381043841996"
> sessions_items_list[[3]]
[1] "111502665618" "111505397996" "121238758674" "131159477858" "161469302097" "161474935929" "171526802604" "231197187139" "231381216285" "251502101205" …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的列表的基本谓词:
sublist(List, Offset, Length, Sublist)
sublist(List, Offset, Length, Sublist):-
length(Prefix, Offset),
append(Prefix, Rest, List),
length(Sublist, Length),
append(Sublist, _, Rest).
Run Code Online (Sandbox Code Playgroud)
它从给定长度的初始列表中的第一个元素返回一个子列表.
6 ?- sublist([a,b,c,d,e,f,g,h,i,j,k], 3, 6, X).
X = [d, e, f, g, h, i].
Run Code Online (Sandbox Code Playgroud)
我想用一个下限和上限来转换这个谓词,它直接是原始列表的元素,就像这样
sublist([a,b,c,d,e,f,g,h,i,j,k], d, i, X).
X = [d, e, f, g, h, i].
Run Code Online (Sandbox Code Playgroud)
这该怎么做?
我试图在对列表上使用find函数,我想找到第一个元素等于x的第一对,所以我写道:
find (x == fst) list
Run Code Online (Sandbox Code Playgroud)
由于fst函数缺少一个参数,我认为(x == fst)是一个接受元组并返回布尔值的函数,但编译器将其解释为布尔值,就好像fst是一个变量一样.也许fst被解释为一种功能?但这不是要求它被()包围吗?
我确实使用列表理解来解决问题,但我仍然很好奇如何使用find来解决它.
作为Tic Tac Toe玩机器人的一部分,我需要一个功能来评估瓷砖与点的组合.代码看起来像这样:
(case combination
("EEEEE" 0)
("EEEEP" 1)
("EEEPE" 1)
("EEEPP" 2)
("EEPEE" 1)
("EEPEP" 2)
("EEPPE" 2)
("EEPPP" 3)
("EPEEE" 1)
("EPEEP" 2)
("EPEPE" 2)
("EPEPP" 3)
("EPPEE" 2)
("EPPEP" 3)
("EPPPE" 3)
("EPPPP" 4)
("PEEEE" 1)
("PEEEP" 2)
("PEEPE" 2)
("PEEPP" 3)
("PEPEE" 2)
("PEPEP" 3)
("PEPPE" 3)
("PEPPP" 4)
("PPEEE" 2)
("PPEEP" 3)
("PPEPE" 3)
("PPEPP" 4)
("PPPEE" 3)
("PPPEP" 4)
("PPPPE" 4)
("PPPPP" 5))
Run Code Online (Sandbox Code Playgroud)
(这不是讨论这种方法的价值的地方,因为它被用于与问题无关的原因)
问题是case使用的谓词对于不是同一个对象的相同字符串不返回true(如果是eq或eql则很难找到).你怎么能改变它?
编辑:我通过将字符串转换为相应的二进制数来解决原始问题,可以使用eql进行比较或用作列表中的索引.
我有一个结构蜘蛛:
(defstruct spider omegas values k)
Run Code Online (Sandbox Code Playgroud)
和一个实例蜘蛛:
(set '*spider* (make-spider
:omegas '()
:values (list *input*)
:k '(#'omegashift #'dec #'dupval '((0 . #'dec) (1 . #'inc) (2 . #'dec)))))
Run Code Online (Sandbox Code Playgroud)
但是当我运行表达式时:(listp (car (spider-k *spider*))在 Emacs 和 SBCL 上(并且涉及 SLIME,但我不确定它是什么。)REPL 返回T. 这显然令人困惑,因为(car (spider-k *spider*)正确返回#'OMEGASHIFT和(listp (function OMEGASHIFT))正确返回NIL。
为什么是(listp (car (spider-k *spider*))真的?不应该是假的吗?