如果我的模型中有两个实体,"People"和"Addresses",并且一个特定Person有零个或多个地址,通过AddressList导航属性访问,我可以编写一个OData查询来回答以下问题:
"哪个人的姓氏以史密斯结尾,至少有一个地址?"
在我看来,我只能在这里做一个谓词,例如
http:// localhost:55100/DemographicsDataService.svc/People?$ filter = endswith(LastName,'Smith')
(我还不相信我甚至可以写一个$ filter来处理第二个谓词..在这种情况下,假设我试图回答这个问题,"姓氏以史密斯结尾,名字以玛丽开头")
在c#.NET 2.0中有什么办法!结合多个谓词?
假设我有以下代码.
List<string> names = new List<string>();
names.Add("Jacob");
names.Add("Emma");
names.Add("Michael");
names.Add("Isabella");
names.Add("Ethan");
names.Add("Emily");
List<string> filteredNames = names.FindAll(StartsWithE);
static bool StartsWithE(string s)
{
if (s.StartsWith("E"))
{
return true;
}
else
{
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这给了我:
Emma
Ethan
Emily
Run Code Online (Sandbox Code Playgroud)
所以这是非常酷的东西,但我知道希望能够使用多个谓词进行过滤.
所以我希望能够说出这样的话:
List<string> filteredNames = names.FindAll(StartsWithE OR StartsWithI);
Run Code Online (Sandbox Code Playgroud)
为了得到:
Emma
Isabella
Ethan
Emily
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?目前我只是过滤完整列表两次,然后将结果合并.但不幸的是,这是非常无效的,更重要的是我失去了原始的排序顺序,这在我的情况下是不可接受的.
我还需要能够迭代任意数量的过滤器/谓词,因为可能会有很多.
再次,它需要是一个.NET 2.0解决方案,遗憾的是我不能使用更新版本的框架
非常感谢.
我有一个对象的矢量(顺序很重要)(让我们称之为myobj类),我试图一次删除多个对象.
class vectorList
{
vector<*myobj> myList;
};
class myobj
{
char* myName;
int index;
bool m_bMarkedDelete;
}
Run Code Online (Sandbox Code Playgroud)
我认为最好的方法是将特定的myobj对象标记为删除,然后在向量上调用myList.remove_if().但是,我不确定如何使用谓词等.我应该在对象中创建一个成员变量,它允许我说我要删除myobj然后创建一个谓词来检查成员变量是否已设置?
如何将谓词实现为vectorList类的一部分?
正如标题中所述,我正在寻找一个预先存在的功能界面,Predicate但其test方法不需要参数.如果这样的动物存在,我会很感激参考.
谢谢.
我只需要澄清给定的集合包含一个元素.
我可以做到这一点,collection.Count(foo => foo.Bar == "Bar") > 0)但它会做不必要的工作 - 迭代整个集合,而我需要在第一次出现时停止.
但我想尝试使用Contains()谓词,例如foo => foo.Bar == "Bar".
目前IEnumerable<T>.Contains有两个签名:
IEnumerable<T>.Contains(T)
IEnumerable<T>.Contains(T, IEqualityComparer<T>)
所以我必须指定一些变量来检查:
var collection = new List<Foo>() { foo, bar };
collection.Contains(foo);
Run Code Online (Sandbox Code Playgroud)
或写我IEqualityComparer<Foo>将用于反对我的收藏的自定义:
class FooComparer : IEqualityComparer<Foo>
{
public bool Equals(Foo f1, Foo f2)
{
return (f1.Bar == f2.Bar); // my predicate
}
public int GetHashCode(Foo f)
{
return f.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
那么有没有其他方法可以使用谓词?
我正在使用visual studio 2010,我正在尝试使用std :: copy_if,我想复制所有满足谓词的值.例如:
struct comp
{
bool operator()(const int i) { return i == 5 || i == 7; }
};
int main()
{
array<int, 10> arr = { 3, 2, 5, 7, 3, 5, 6, 7 };
vector<int> res;
copy_if(arr.begin(), arr.end(), res.begin(), comp());
for(int i = 0; i < res.size(); i++)
{
cout << res[i] << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行此代码时,我得到:向量迭代器不可递增.
假设我有一串字符串.
final Stream<String> stream = ...;
Run Code Online (Sandbox Code Playgroud)
我想在修剪后过滤掉每个空字符串.
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(v -> !v.isEmpty());
Run Code Online (Sandbox Code Playgroud)
有没有办法应用Predicate#negate()替换v -> !v.isEmpty()部分?
.filter(((Predicate) String::isEmpty).negate()) // not compile
Run Code Online (Sandbox Code Playgroud) 我知道这可能是一个非常基本的问题,但我想知道Java8中的a Predicate和Function接口有什么区别?
Predicate<String> predicateTest = (s)-> s.length() > 5;
System.out.println(predicateTest.test("Predicate"));
Function<String, Boolean> functionTest = str -> str.length()> 5;
System.out.println(functionTest.apply("Function"));
Run Code Online (Sandbox Code Playgroud)
这里在我的例子中都返回true.唯一的问题是呼叫的方式是不同的?
我最近在Clojure上看过很多关于谓词调度的讨论,并想知道这件事是否有什么东西.换句话说,什么是谓词调度,它与通用函数,OOP多态和模式有何不同?谢谢