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

Coolest C# LINQ/Lambdas trick you've ever pulled?

看到一篇关于c中隐藏特性的文章,但没有很多人写过linq/lambdas示例,所以…我想知道…

What's the coolest (as in the most elegant) use of the C# LINQ and/or Lambdas/anonymous delegates you have ever saw/written?

如果它也投入生产,就可以获得奖金!


线条划痕者肯定在我的列表上

我不确定是否有优雅的资格,但这是我见过的最冷酷的链接!

哦,我只是太清晰了,我没有写(路克·霍班)


一些基本功能:

ZZU1

如果你不知道如何使用它们,那就不要太好了。为了知道你需要知道他们的目的

  • Currying是什么?
  • 什么是Y组合器?


从远处看,我来过的最引人注目的联系是布拉马框架。

它可以被用于平行计算GPU,使用Linq到GPU。你在Linq上写了一个Query,然后Brahma将它翻译成HLSL(高水平的Shader Language),所以直接可以在GPU上处理。

这个网站只让我留下一条链接,所以试着从多特尼特洛克斯的网路:

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

Else Google for Brahma Project,you'll get the right pages.

非常酷的Stuff

GJ


Progress reporting for long running linqueries.在博客邮件中,你可以找到一个扩展的方法,在报告()中,你可以发现并报告一个链接的进展,作为执行。


对我来说,代表团(EDOCX1,6,7,7)和表达式(EDOCX1,8,8,EDOCX1,9)之间的双重性是给Lambdas最干净的使用带来的。

For example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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);
        }
    }
}

然后你可以呼叫"安全"IDOCX1〔10〕

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

注:我在网上看到这一点,前几个星期,失去了链接和变量分数,从那时起,我害怕我无法给出预定的分配。


http://igoro.com/archive/extended-linq-additional-operators-for-linq-to-objects/

http://igoro.com/archive/7-tricks-to-simplify-your-programs-with-linq/


事实上,我为生成Excel Documents感到骄傲:http://www.aaron-powell.com/linq-to-xml-to-excel


Not my design but I used it a few times,a typed-switch statement:http://community.bartdesmet.net/blogs/bart/archive/2008/03/30/A-functional-c-type-switch.aspx

救我如此多Else If…Else If…Else If!声明


我做了一个(一个疯子,但有兴趣)的事情,就像刚才一样:

  • http://tomasp.net/blog/reactive-iv-reactive egame.aspx

也许不是最酷的,但最近我一直在使用它们,每当我有一个代码块让C+PD一次又一次地得到C+PD,只是为了改变几行代码。例如,运行简单的SQL命令来检索数据可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
    }
);

它可以返回今天创建的文章列表。这样,我就不必为每个命令、对象等执行1500万次复制和粘贴try catch finally块。


我认为链接是一个重要的净变化,是一个非常强大的工具。我用链接到XML的生产,从6MB XML文件(20+node levels)到两条编码线的数据集。在把这条线连接起来之前,我们将用一系列的代码和一天的时间来解答这一问题。这就是我所说的优雅!


我试着以一种冷静的方式来建立一个导航控制,为一个网站我正在建造。我想使用正常的HTML不规则的列表元素(使用标准CSS"sucker fish"look)和一个超导航小鼠效应,该效应使下面的项目显现出来。我有一个SQL依赖于用两个表格(Navigationtoplevels&Amp NavigationBottomlevels)封存数据集。然后,我必须以需要的特性(TOPNAV&)创建两类物体(TOPNAV&SUBNAV)("TOPNAV Class had to have a generic list of bottomnav items-">listsubitems)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var TopNavs = from n in ds.NavigationTopLevels
                          select new TopNav
                          {
                              NavigateUrl = String.Format("{0}/{1}", tmpURL, n.id),
                              Text = n.Text,
                              id = n.id,
                              SubItems = new List<SubNav>(
                                  from si in ds.NavigationBottomLevels
                                  where si.parentID == n.id
                                  select new SubNav
                                  {
                                      id = si.id,
                                      level = si.NavLevel,
                                      NavigateUrl = String.Format("{0}/{1}/{2}", tmpURL, n.id, si.id),
                                      parentID = si.parentID,
                                      Text = si.Text
                                  }
                                )

                          };

 List<TopNav> TopNavigation = TopNavs.ToList();

它可能不是"冷淡"的,但对于一大批想要有动态导航的人来说,它的甜蜜并不意味着它必须在通常的逻辑上随之出现。Linq is,if anything save a time in this case.


olinq对inotifyingcollection的反应性linq查询-这些查询允许您对大型数据集进行实时聚合(除其他外)。

https://github.com/wasabii/olinq


Working with attributes:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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);
        }
}

扩展方法

1
2
3
4
5
6
7
8
9
10
11
12
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>();
    }
}

生产守则和防范GetAttributeHasAttribute本例中使用letwhere条款。