为简单起见,假设我有一个包含A,B和C类型对象的ArrayList.如何只提取A类对象?
我是使用lambda表达的新手,对不起是一个愚蠢的问题.无论如何,请考虑此声明:
MethodInfo methodInfo = methodInfos.Where(k => k.GetCustomAttributes(typeof(DLMethodAttribute), false).Length > 0).Single();
Run Code Online (Sandbox Code Playgroud)
我的问题是如何判断谓词部分是否有结果,考虑methodinfos没有任何成员具有属性.我有一条错误消息告诉"序列不包含任何元素"
正如标题所说,我想给我的lambda函数一个名称,以便稍后在我的代码中调用它.
但是我要将它与之关联的名称是一个变量.我能做什么?
(defparameter funct-name 'addone)
funct-name = (lambda (x) (x+1))
Run Code Online (Sandbox Code Playgroud)
所以我的电话必须是这样的:
(addone 3)
Run Code Online (Sandbox Code Playgroud)
funct-name 是一个变量,包含我想要给我的lambda函数的名称.
代表可以合并,所以:
MethodInvoker del = delegate { Console.WriteLine("Delegate 1"); };
del += delegate { Console.WriteLine("Delegate 2"); };
del.Invoke();
Run Code Online (Sandbox Code Playgroud)
输出:
Delegate 1
Delegate 2
Run Code Online (Sandbox Code Playgroud)
既然它调用了两种方法,我试着看它是否会起作用:
Func<Person, bool> filters = person => person.Name.Contains("John");
filters += person => person.Age >= 18;
List<Person> persons = getPersons();
persons.Where(filters);
Run Code Online (Sandbox Code Playgroud)
但它没有,只有最后应用(在这种情况下 person => person.Age >= 18).
我的问题是:为什么不呢?有可能实现这个吗?(并不是说我会重写Linq的扩展方法只是为了实现它,但如果可能的话会很酷)
注意: 我知道在LINQ to Objects中,执行此操作会类似,因为执行是延迟的:
persons.Where( x => x.Name.Contains( nameFilter )).Where( x => x.Age >= 18 );
Run Code Online (Sandbox Code Playgroud)
但这不是我感兴趣的.
我有这些课程:
public class Flight
{
public string FlightNum { get; set; }
public List<Pax> Pax { get; set; }
}
public class Pax
{
public string PaxName { get; set; }
public string PaxSurName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想过滤航班,以便它只包含乘客姓名是 我试过的某个字符串的航班:
var paxList = flights.Where(f => f.Pax.Where(p => p.PaxName == "d"));
Run Code Online (Sandbox Code Playgroud)
上面的代码不起作用......例如:我想在SINGLE Lambda表达式中使用它
基本上我有一个嵌套列表,我试图通过第一个索引进行排序我复制了python howto如何做的方式,但它似乎不起作用,我不明白为什么:
来自网站的代码:
>>> student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2]) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
Run Code Online (Sandbox Code Playgroud)
我的代码:
def print_scores(self):
try:
#opening txt and reading data then breaking data into list separated by "-"
f = open(appdata + "scores.txt", "r")
fo = f.read()
f.close()
userlist = fo.split('\n')
sheet_list = []
for user in userlist:
sheet = user.split('-')
if len(sheet) != 2:
continue …Run Code Online (Sandbox Code Playgroud) 当需要将lambda存储为类成员以便可以延迟调用时,最佳实践是什么?更具体地说,将传递给deferred_lambda下面的代码清单中的类的lambda存储为参考是否安全?如果不是,如果我将lambda存储deferred_lambda为值而不是作为引用,是否安全?
最后,与使用g ++进行常规函数调用相比,我是否可以预期会产生性能损失,以便以这种方式将lambda存储为类成员?也就是说,使用deferred_lambda.invoke()比operator()实现相同操作的某个虚拟结构的调用要慢?
使用g ++,我注意到lambda的大小随着我使用更多捕获的变量而增加.我想这是可以预料到的,因为根据我的理解,编译器在内部为lambda生成一个struct,它包含必要的捕获变量作为成员.这种观察导致了我现在要问的问题,因为按时间和内存存储lambda值可能比存储对它们的引用更昂贵.
template <class Func>
class deferred_lambda
{
Func& func_;
public:
deferred_lambda(Func func) : func_(func) {}
void invoke() { func_(); }
};
template <class Func>
deferred_lambda<Func> defer_lambda(Func func)
{
return deferred_lambda(func);
}
void foo()
{
int a, b, c;
auto x = defer_lambda([&]() { a = 1; b = 2; c = 3; });
}
Run Code Online (Sandbox Code Playgroud) 我有下一个班级和这个班级的集合.我如何通过asc对Perimeter()进行排序?
public class Circle
{
private double _r;
public Double Radius
{
get { return _r; }
set { _r = value; }
}
public double Perimeter ()
{
return 2*Math.PI*Radius;
}
}
...
var lst = new List<Circle>();
Run Code Online (Sandbox Code Playgroud) 我有一个班级玩家,玩家有一个镜头列表.每个镜头都有自己的yPos(位置)因为玩家的yPos可以改变但是射击会保持他的位置:
class Player
{
public string Id { set; get; }
public int yPos { set; get; }
public List<Shot> shots;
public Player(string _Id, int _yPos)
{
Id = _Id;
yPos = _yPos;
}
}
class Shot
{
public int yPos { set; get; }
public Shot(int _yPos)
{
yPos = _yPos;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在游戏中的某个时刻有一个id,我需要找到玩家.并添加他的投篮列表与球员位置的新镜头.
这是我最终得到的:
string tempID = "xxx"; // not important where this temp id is coming from
players.Find(p => p.Id == tempID).shots.Add(new Shot(players.Find(p => p.Id == tempID).yPos)); …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个从给定输入返回methodinfo类的方法,以创建该方法的泛型版本...即
var m = myClass.GetType().GetMethod("SomeMethod").MakeGenericMethod(...blahblah..);
Run Code Online (Sandbox Code Playgroud)
这是有效的,除了我有我的方法名称的字符串文字,所以如果在重新分解的过程中我碰巧重命名我正在使用的方法之一,我直到运行时才发现.
我想要做的是创建一个帮助方法,我可以传递lamba到指定方法组,这样我将得到方法名称的编译时间检查,更不用说智能感知等...即.
MethodInfo mi = myClass.GetMethodInfo( o => o.SomeMethod );
m = mi.MakeGenericMethod(..blah...);
Run Code Online (Sandbox Code Playgroud)
但是我无法弄清楚助手的方法签名......
public MethodInfo GetMethodInfo(Func<MyClass,XXXX> lambda){ //What is my XXXX ? }
Run Code Online (Sandbox Code Playgroud)