最酷的C#LINQ / Lambdas技巧你曾经拉?

看到一个隐藏的function在C#的post,但不是很多人写了linq / lambdas的例子,所以…我不知道…

C#LINQ和/或Lambdas /匿名代理你曾经看过/写过的最酷的(如最优雅的)用法是什么?

如果它已经投入生产也有奖励!

LINQ光线追踪器当然顶在我的列表=)

我不太确定是否有资格成为高雅,但这绝对是我见过的最酷的表情expression!

哦,而且要非常清楚。 我没有写( 卢克·霍class做的)

一些基本function:

public static class Functionals { // One-argument Y-Combinator. public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F) { return t => F(Y(F))(t); } // Two-argument Y-Combinator. public static Func<T1, T2, TResult> Y<T1, T2, TResult>(Func<Func<T1, T2, TResult>, Func<T1, T2, TResult>> F) { return (t1, t2) => F(Y(F))(t1, t2); } // Three-arugument Y-Combinator. public static Func<T1, T2, T3, TResult> Y<T1, T2, T3, TResult>(Func<Func<T1, T2, T3, TResult>, Func<T1, T2, T3, TResult>> F) { return (t1, t2, t3) => F(Y(F))(t1, t2, t3); } // Four-arugument Y-Combinator. public static Func<T1, T2, T3, T4, TResult> Y<T1, T2, T3, T4, TResult>(Func<Func<T1, T2, T3, T4, TResult>, Func<T1, T2, T3, T4, TResult>> F) { return (t1, t2, t3, t4) => F(Y(F))(t1, t2, t3, t4); } // Curry first argument public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(Func<T1, T2, TResult> F) { return t1 => t2 => F(t1, t2); } // Curry second argument. public static Func<T2, Func<T1, TResult>> Curry2nd<T1, T2, TResult>(Func<T1, T2, TResult> F) { return t2 => t1 => F(t1, t2); } // Uncurry first argument. public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(Func<T1, Func<T2, TResult>> F) { return (t1, t2) => F(t1)(t2); } // Uncurry second argument. public static Func<T1, T2, TResult> Uncurry2nd<T1, T2, TResult>(Func<T2, Func<T1, TResult>> F) { return (t1, t2) => F(t2)(t1); } } 

如果你不知道如何使用它们,不要做太多的事情。 为了知道这一点,你需要知道他们是什么:

  • 什么是咖喱?
  • 什么是y-组合器?

到目前为止,我所见过的最令人印象深刻的Linq实现是Brahma框架。

它可用于使用“Linq to GPU”将并行计算卸载到GPU。 你用linq写了一个“查询”,然后Brahma把它翻译成HLSL(高级着色语言),DirectX可以在GPU上处理它。

这个网站只会让我粘贴一个链接,所以请尝试从dotnetrocks这个networking广播:

http://www.dotnetrocks.com/default.aspx?showNum=466

除了Brahma项目的谷歌,你会得到正确的页面。

非常酷的东西。

GJ

进度报告长时间运行的LINQ查询。 在博客文章中,您可以find一个扩展方法WithProgressReporting(),它可以让您发现并报告linq查询在执行时的进度。

对我来说,代表( Func<T,R>Action<T> )和expression式( Expression<Func<T,R>> Expression<Action<T>> )之间的对偶是最聪明的用法lambdaexpression式。

例如:

 public static class PropertyChangedExtensions { public static void Raise(this PropertyChangedEventHandler handler, Expression<Func<object>> propertyExpression) { if (handler != null) { // Retrieve lambda body var body = propertyExpression.Body as MemberExpression; if (body == null) throw new ArgumentException("'propertyExpression' should be a member expression"); // Extract the right part (after "=>") var vmExpression = body.Expression as ConstantExpression; if (vmExpression == null) throw new ArgumentException("'propertyExpression' body should be a constant expression"); // Create a reference to the calling object to pass it as the sender LambdaExpression vmlambda = Expression.Lambda(vmExpression); Delegate vmFunc = vmlambda.Compile(); object vm = vmFunc.DynamicInvoke(); // Extract the name of the property to raise a change on string propertyName = body.Member.Name; var e = new PropertyChangedEventArgs(propertyName); handler(vm, e); } } } 

然后你可以通过调用“安全地”实现INotifyPropertyChanged

 if (PropertyChanged != null) PropertyChanged.Raise( () => MyProperty ); 

注意:我几个星期前在网上看到了这个,然后就失去了联系,从那以后,各种各样的变化出现了,所以恐怕我不能给予适当的归属。

不是我的devise,但我用了几次,一个键入开关语句: http : //community.bartdesmet.net/blogs/bart/archive/2008/03/30/a-functional-c-type-switch的.aspx

如果…其他如果…其他如果…其他如果我还能保存好多这么多! 声明

其实,我为生成Excel文档感到非常自豪: http ://www.aaron-powell.com/linq-to-xml-to-excel

我刚刚做了一个(有点疯狂,但有趣)的事情:

我试图想出一个很酷的方式来build立一个我正在build立的网站的导航控制。 我想使用常规的HTML无序列表元素(采用标准的CSS“吸鱼”外观 )与顶部导航鼠标hover的效果,显示下拉项目。 我有一个SQL依赖caching数据集与两个表(NavigationTopLevels&NavigationBottomLevels)。 然后,我只需要创build两个类对象(TopNav&SubNav)与less数必需的属性(TopNav类必须有一个bottomnav项目的通用列表 – > List <SubNav> SubItems)。


var TopNavs =从ds.NavigationTopLevels中的n select新的TopNav { NavigateUrl = String.Format(“{0} / {1}”,tmpURL,n.id), Text = n.Text, id = n.id, SubItems =新列表<SubNav>( 来自ds.NavigationBottomLevels中的si 其中si.parentID == n.id select新的SubNav { id = si.id, 水平= si.NavLevel, NavigateUrl = String.Format(“{0} / {1} / {2}”,tmpURL,n.id,si.id), parentID = si.parentID, Text = si.Text } ) }; List <TopNav> TopNavigation = TopNavs.ToList();

它可能不是“最酷”的,但对于很多想要dynamic导航的人来说,它的甜心不必混淆在通常的循环逻辑中。 如果在这种情况下节省时间,LINQ是。

我认为LINQ是.NET的一个重大改变,它是一个非常强大的工具。

在生产中,我使用LINQ to XML来parsing和过滤来自6MB XML文件(具有20多个节点级别)的logging,并将其logging在两行代码中的数据集中。

在LINQ之前,这将花费数百行代码和日子进行debugging。

这就是我所说的优雅!

也许不是最酷的,但最近我一直在使用它们,只要有一段代码重复得到C + Pd,只是有几行改变。 例如,运行简单的SQL命令来检索数据可以这样做:

 SqlDevice device = GetDevice(); return device.GetMultiple<Post>( "GetPosts", (s) => { s.Parameters.AddWithValue("@CreatedOn", DateTime.Today); return true; }, (r, p) => { p.Title = r.Get<string>("Title"); // Fill out post object return true; } ); 

这可能会返回今天创build的post列表。 这样,我不必为每个命令,对象等复制和粘贴try-catch-finally块一千五百万次。

使用属性:

 private void WriteMemberDescriptions(Type type) { var descriptions = from member in type.GetMembers() let attributes = member.GetAttributes<DescriptionAttribute>(true) let attribute = attributes.FirstOrDefault() where attribute != null select new { Member = member.Name, Text = attribute.Description }; foreach(var description in descriptions) { Console.WriteLine("{0}: {1}", description.Member, description.Text); } } 

GetAttributes扩展方法:

 public static class AttributeSelection { public static IEnumerable<T> GetAttributes<T>(this ICustomAttributeProvider provider, bool inherit) where T : Attribute { if(provider == null) { throw new ArgumentNullException("provider"); } return provider.GetCustomAttributes(typeof(T), inherit).Cast<T>(); } } 

AttributeSelection是生产代码,也定义了GetAttributeHasAttribute 。 我select在这个例子中使用letwhere子句。

OLINQ通过INotifyingCollection进行react native的LINQ查询 – 它们允许您(除其他之外)对大数据集进行实时聚合。

https://github.com/wasabii/OLinq