Tag: lambda

C#委托与lambda表达式的反演

下面的第二个测试方法不编译(不能将lambda表达式转换为目标类型D1 )。 这是否意味着(非generics)委托契约不适用于lambda表达式? [TestFixture] public class MyVarianceTests { private abstract class Animal {} private class Tiger : Animal {} private delegate Type D1(Tiger tiger); private static Type M1(Animal animal) { return animal.GetType(); } [Test] public void ContravariantDelegateWithMethod() { D1 func = M1; Type result = func(new Tiger()); Assert.AreEqual(result, typeof (Tiger)); } [Test] public void ContravariantDelegateWithLambda() […]

当作为方法组调用时,Type.GetType失败但在lambda表达式中没有

以下示例显示Type.GetType在特定方案中失败。 当我在lambda表达式中提供类名字符串(包括命名空间)时,GetType会成功,但是当我将GetType指定为方法组时,会失败。 失败: collectionOfClassNames.Select(GetType) 成功: collectionOfClassNames.Select(s => GetType(s)) 当类路径包含程序集名称时,这两种方法都会成功。 我怀疑它与当前上下文/范围有关,因为上面生成了IL。 我可以看到IL的差异,但我仍然无法解释确切的原因。 以下是演示该问题的可运行示例。 using System; using System.Linq; using System.Reflection; namespace GetTypeTest { public class FindMe{} class Program { static void Main(string[] args) { var assemblyName = Assembly.GetExecutingAssembly().FullName; var className = “GetTypeTest.FindMe”; var classAndAssembly = string.Format(“{0}, {1}”, className, assemblyName); // 1) GetType succeeds when input is “class, […]

在针对.NET 2.0时使用(某些)lambda表达式?

ReSharper建议我们改变: System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; }; 成: System.Net.ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true; 它看起来更清洁。 但我们的目标是.NET 2.0。 这还是我们应该做的吗?

Generic Linq OrderBy函数的问题

我在post中看到了以下函数,它允许用户使用generics表达式对数据进行排序: public static IOrderedQueryable OrderBy( this IQueryable source, Expression<Func> func, bool isDescending) { return isDescending ? source.OrderByDescending(func) : source.OrderBy(func); } 当我尝试使用这个函数时,我得到一个错误,说“找不到类型或命名空间名称”TKey’(你错过了使用指令或程序集引用吗?)“。我在这里做了一些蠢事,但我可以弄清楚。 编辑: 在做了一些研究之后,我认为我的问题在于构建我传递给它的Expression。 是否可以构建一个可以包含不同类型的表达式? 假设我的数据集有一个字符串,一个int和一个bool,我想使用上面的generics函数来排序任何项目。 我该怎么做呢? 我现在有这个工作: if (IsString) { Expression<Func> expString = …; // call orderBy with expString } else if (IsInt) { Expression<Func> expInt; // call orderBy w/ expInt } : 我想要的东西: Expression<Func> […]

LinqToSql奇怪的行为

我有以下代码: var tagToPosts = (from t2p in dataContext.TagToPosts join t in dataContext.Tags on t2p.TagId equals t.Id select new { t2p.Id, t.Name }); //IQueryable tag2postsToDelete; foreach (Tag tag in tags) { Debug.WriteLine(tag); tagToPosts = tagToPosts.Where(t => t.Name != tag.Name); } IQueryable tagToPostsToDelete = (from t2p in dataContext.TagToPosts join del in tagToPosts on t2p.Id equals del.Id select […]

在c#中,为什么lambda不能有扩展?

在Unity中,这是c#中的一个类别, public static class HandyExtensions { public static IEnumerator Tweeng( this System.Action v, float d ) { while (..) { .. v( 13f*t ); yield return null; } v(13f); } 编译好! 但是如果你试着用它, yield return StartCoroutine( ( (x)=>laser=x ).Tweeng(3.141f) ); 出现这种令人悲伤的错误 : 资产/脚本/ … cs(116,34):错误CS0023:The .’ operator cannot be applied to operand of type .’ operator […]

如何逃避c#中的关键词?

我想在c#中做相同的以下VB Function([class]) “hello” 这与c#中的相同 class=>”hello” 问题是单词class是该语言中的关键词。 但我想将它用作变量名。 在VB示例中,您可以使用[]括号“转义”该关键字,并允许将其用作变量名。 有没有办法在C#中做到这一点?

C#方法组怪异

我发现了一些非常奇怪的东西,我希望能更好地理解。 var all = new List{ new int[]{1,2,3}, new int[]{4,5,6}, new int[]{7,8,9} }; all.ForEach(n => n.ForEach(i => Console.WriteLine(i))); 可以改写为: … all.ForEach(n => n.ForEach(Console.WriteLine)); 如何省略lambda表达式参数(i =>)并仍然将当前项传递给console.WriteLine? 感谢您的任何见解。 -Keith

Linq嵌套列表表达式

我需要你对Linq表达的帮助: 我有嵌套的列表对象,这是主对象层次结构的样子(每个破折号是子类的属性): Folder -name -List Subfolders -name -List Documents -name -key 拥有这个对象层次结构,我有一个文档名称,我想搜索它并返回其父文件夹(子文件夹) 例: Folder -name: Customer -List Subfolders -name: Personal -List Documents -name: Resume -key : 1 如果我说:“恢复”,linq表达式应该返回我:子文件夹“Personal”(对象)。 请帮助我,因为有两个嵌套的列表我遇到了麻烦,一个很容易。 提前致谢。

是否可以在C#中定义通用lambda?

我在一个操作指定类型的方法中有一些逻辑,我想创建一个封装逻辑的通用lambda。 这就是我想要做的精神: public void DoSomething() { // … Func GetTypeName = () => T.GetType().Name; GetTypeName(); GetTypeName(); GetTypeName(); // … } 我知道我可以将类型作为参数传递或创建generics方法。 但我很想知道lambda是否可以定义自己的通用参数。 (所以我不是在寻找替代方案。)据我所知,C#3.0不支持这一点。