C#.NET 3.5.我试图理解C#Action对象的内在限制.在lamda(实际上是那些lamdas?)中,我们可以执行赋值,调用函数,甚至执行三元运算,但是我们不能执行多语句操作.
这是因为单语句执行只是将它包装在委托中的语法糖吗?为什么下面的第一个例子不起作用?
public class MyClass
{
private int m_Count = 0;
public void Test()
{
int value = 0;
// Does not work, throws compile error
Action action = () => { if(m_Count < 10) m_Count++; value = m_Count; }
// Works
Action action2 = () => value = delegate(){
if(m_Count < 10)
m_Count++;
return m_Count;
};
// Works
Action action3 = () => value = m_Count;
// Works
Action action4 = () => value = m_Count < 10 …Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个愚蠢的小应用程序来测试我的一个库.我希望应用程序向用户显示命令列表,允许用户键入命令,然后执行与该命令关联的操作.听起来很简单.在C#中,我最终会编写一个命令列表/映射,如下所示:
class MenuItem
{
public MenuItem(string cmd, string desc, Action action)
{
Command = cmd;
Description = desc;
Action = action;
}
public string Command { get; private set; }
public string Description { get; private set; }
public Action Action { get; private set; }
}
static void Main(string[] args)
{
var items = new List<MenuItem>();
items.Add(new MenuItem(
"add",
"Adds 1 and 2",
()=> Console.WriteLine(1+2)));
}
Run Code Online (Sandbox Code Playgroud)
有关如何在C++中实现此目的的任何建议?我真的不想为每个命令定义单独的类/函数.我可以使用Boost,但不能使用TR1.
请考虑以下代码:
private static void WriteProcesses(StreamWriter sw, DateTime d) {
sw.WriteLine("List of processes @ " + d.ToString());
Process[] localAll = Process.GetProcesses().Where(o => o.ProcessName.ToLower() != "svchost");
if(localAll.Length > 0) {
for(int i = 0; i < localAll.Length; i++) {
sw.WriteLine(" " + localAll[i].ProcessName);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我得到一条红色的波浪线说:
无法将类型System.Collections.Generic.IEnumerable'隐式转换为'System.Diagnostics.Process []'.存在显式转换(您是否错过了演员?)
我尝试将数组更改为List但没有工作.
我已经创建了一个自定义线程池实用程序,但似乎有一个我找不到的问题.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
namespace iWallpaper.S3Uploader
{
public class QueueManager<T>
{
private readonly Queue queue = Queue.Synchronized(new Queue());
private readonly AutoResetEvent res = new AutoResetEvent(true);
private readonly AutoResetEvent res_thr = new AutoResetEvent(true);
private readonly Semaphore sem = new Semaphore(1, 4);
private readonly Thread thread;
private Action<T> DoWork;
private int Num_Of_Threads;
private QueueManager()
{
Num_Of_Threads = 0;
maxThread = 5;
thread = new Thread(Worker) {Name = "S3Uploader EventRegisterer"};
thread.Start();
// log.Info(String.Format("{0} [QUEUE] FileUploadQueueManager created", DateTime.Now.ToLongTimeString()));
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C#3中学习lambda,并想知道如何使用lambdas编写这个函数:
假设您有Point3值的集合.
对于这些点中的每一点,p:
创建一个新的p,其中.Y是:
Math.Sin ((center - p).Length * f)
Run Code Online (Sandbox Code Playgroud)
center和f是要提供给函数的外部变量.Point3类型也将有一个带x,y,z值的构造函数.
string x;
foreach(var item in collection)
{
x += item+",";
}
Run Code Online (Sandbox Code Playgroud)
我可以用lambdas写这样的东西吗?
如何在lambda表达式的谓词中使用"And".我正在努力实现像这样的
新Class1("Test",Status => Status == 18 && 19 && 20)
请回复
谢谢沙拉斯
我最近搬到了.net 3.0(Windows窗体,C#).我想更多地了解谓词和lambda表达式.我们应该在哪里使用它们?他们是否提高了表现?以及他们如何在内部工作.谢谢.
我有这个方法
public static List<Contact> Load(string filename)
{
if (!File.Exists(filename))
{
throw new FileNotFoundException("Data file could not be found", filename);
}
var contacts =
System.Xml.Linq.XDocument.Load(filename).Root.Elements("Contact").Select
(
x => new Contact() { //errors out here, XXXXXX
FirstName = (string)x.Element("FirstName"),
LastName = (string)x.Element("LastName"),
Email = (string)x.Element("Email")
}
);
return contacts.ToList();// is this line correct?, it should return List...
}
Run Code Online (Sandbox Code Playgroud)
我有Contact.xml和Contact元素.
<Contacts>
<Contact>
<FirstName>Mike</FirstName>
<LastName>Phipps</LastName>
<Email>mike@contoso.com</Email>
</Contact>
<Contact>
<FirstName>Holly</FirstName>
<LastName>Holt</LastName>
<Email>holly@contoso.com</Email>
</Contact>
<Contact>
<FirstName>Liz</FirstName>
<LastName>Keyser</LastName>
</Contact>
</Contacts>
Run Code Online (Sandbox Code Playgroud)
我有一个contact.cs与此代码
public class Contact
{
public Contact(string …Run Code Online (Sandbox Code Playgroud) 以下get函数将使用可变参数返回一个字符串数组。它还通过简单地转换整数来处理提供整数的情况。我提供了这个转换函数的两个版本,一个是 lambda,另一个是自由函数。
请有人解释一下为什么使用 lambda 无法编译,而看似相同的自由函数却可以正常工作。需要进行哪些更改才能使 lambda 案例发挥作用?
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <format>
#include <array>
#include <type_traits>
// free function converter
template <typename KEY>
auto convert_to_string_view(const KEY& key)
{
if constexpr (std::is_integral_v<KEY> && !std::is_same_v<KEY, bool>)
return std::to_string(key);
else
return key;
}
// make an array out of varargs
template <typename T, typename... Args>
inline std::array<std::common_type_t<Args...>, sizeof...(Args)>
make_array_from_vars(const Args&... args)
requires (std::is_constructible_v<std::common_type_t<Args...>, Args> && ...)
{
return { args... };
}
template<typename... KEYS>
auto get(KEYS... …Run Code Online (Sandbox Code Playgroud)