知乎周源微信_每周源代码7

知乎周源微信

知乎周源微信

In my new ongoing quest to read source code to be a better developer, I now present the seventh in an infinite number of a weekly series called "The Weekly Source Code." Here's some source I'm reading this week that I enjoyed.

在我不断追求读取源代码以成为更好的开发人员的追求中,我现在以每周系列的无数个“每周源代码”的形式展示第七个。 这是我本周喜欢的一些资料。

I got a little sidetracked the recent trip to the ALT.NET conference, so forgive me for missing last week.

最近的ALT.NET会议之旅让我有些困惑,所以请原谅我上周的失踪。

  • Joe Cheng's Schwartzian Transform in C# 3.0 - Whenever someone knows the official name for technique, be it in chess or in code, they're usually smarter than I. "You are using Bonetti's Defense against me, ah?" Joe is one of those guys. ;)

    郑元畅的使用Schwartzian变换在C#3.0 -每当有人知道对于技术的正式名称,无论是在国际象棋或代码,他们通常更聪明的是比我你正在使用博内蒂的防御我啊? 乔是其中之一伙计们;)

    "What’s a

    “什么是

    Schwartzian Transform? It’s a way of efficiently sorting a list of objects according to some potentially expensive-to-calculate property of those objects. For example, let’s say you have an array of filenames, and you want to sort them by their last modified dates"

    Schwartzian转换? 这是一种根据对象潜在的昂贵计算属性对对象列表进行有效排序的方法。 例如,假设您有一个文件名数组,并且想按文件的最后修改日期对其进行排序”

    This is a very useful technique to know and nice and clean in C# 3.0.

    在C#3.0中,这是一种非常有用的知识,非常好用。

public static List<TElement> SortBy2<TElement, TSortBy>(
        this List<TElement> coll,
        Converter<TElement, TSortBy> converter,
        Comparison<TSortBy> comparison)
    {
        return coll
            .ConvertAll(el => new { Key = converter(el), Value = el })
            .Sort((a, b) => comparison(a.Key, b.Key))
            .ConvertAll(x => x.Value);
    }
  • LINQ to Amazon - This is a little old, but it's still darn interesting to read. If you've been thinking about implementing LINQ over an object or web service that your company has, this is a good place to start. I'll let you go digging around, but here's some bits I found interesting. Note also that the code is very old and I haven't been able to find the latest stuff.

    LINQ to Amazon-这有点老了,但阅读起来仍然很有趣。 如果您一直在考虑对公司拥有的对象或Web服务实施LINQ,那么这是一个不错的起点。 我会让您继续研究,但是这里有些有趣的地方。 还要注意,代码很旧,我找不到最新的东西。

    This is what I call Left-Hand/Right-Hand code where we're pulling with one hand, in this case XML and handing off with the other hand, in this case, making a LINQ List.  It tends to be very tedious but LINQ sure makes it easy.

    这就是我所说的“左手/右手”代码,我们用一只手(在这种情况下为XML)拉动代码,而用另一只手在这种情况下进行交接,从而生成LINQ列表。 它通常很繁琐,但是LINQ确实使它变得容易。

  • XNamespace ns = NAMESPACE_AWSECommerceService; 
    var books = from book in booksDoc.Descendants(ns+"Item") 
        select new Book { 
            Title = book.Element(ns+"ItemAttributes").Element(ns+"Title").Value, 
                                Publisher = book.Element(ns+"ItemAttributes").Element(ns+"Publisher").Value, 
                                Year = uint.Parse(((String)book.Element(ns+"ItemAttributes").Element(ns+"PublicationDate").Value).Substring(0, 4)), 
                                Authors = ( from author in book.Descendants(ns+"Author") 
            select (String) author.Value ).ToList() 
    };
    
  • Argotic Syndication Framework - Woof, a full implementation of Atom 1.0, OPML 2.0, RSD 1.0, and RSS 2.0 syndication formats. If you're looking for syndication source look no further. This is not only very clean code that's also well organized with a very interesting extension mechanism for including other namespaces within your syndication format.  It's also excessively well documented. I hate them. ;) Although, I'm not sure where the tests are, it's pretty clear that this reflects a huge amount of work.  Or a lot of code generation.

    Argotic Syndication Framework -Woof,是Atom 1.0OPML 2.0RSD 1.0RSS 2.0联合格式的完整实现。 如果您正在寻找联合来源,那就别无所求。 这不仅是非常干净的代码,而且还通过非常有趣的扩展机制进行了良好的组织,以在您的联合格式中包括其他名称空间。 它也有充分的记录。 我恨他们。 ;)尽管我不确定测试在哪里,但是很明显这反映了大量的工作。 还是很多代码生成。

    There is far too much to paste much here, but what are the things I click away was a new attribute but I hadn't heard of yet. You can tell FxCop to relax as they do here with a naming rule.

    这里要粘贴的内容太多了,但是我单击的内容是一个新属性,但是我还没有听说过。 您可以通过命名规则告诉FxCop放松,就像他们在这里一样。

  • [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rss")]
    public class RssFeedCreatedEventArgs : EventArgs, IComparable {...
    
  • LukeH and a fully LINQified RayTracer - Seriously, someone give this guy some money or a warm handshake or something. This is unreal...it's single line of LINQ. That means it's one expression. Luke is a glutton for punishment because I'm still trying to get my brain around the statement. This guy is a beast. I'm thinking of starting a cult around him. Here's his code, but go read his post for the explanation. Go! Right now! I'll wait here.

    LukeH和完全LINQified RayTracer-认真的说,有人给这个人一些钱或热烈的握手之类的东西。 这是不真实的...这是LINQ的单行。 这意味着它是一种表达。 卢克(Luke)是惩罚的嘴,因为我仍在努力使自己的头脑与声明无关。 这个家伙是野兽。 我正在考虑开始对他进行崇拜。 这是他的代码,但是请阅读他的文章以获取解释。 走! 马上! 我在这里等

    LukeH and a fully LINQified RayTracer - Seriously, someone give this guy some money or a warm handshake or something. This is unreal...it's single line of LINQ. That means it's one expression. Luke is a glutton for punishment because I'm still trying to get my brain around the statement. This guy is a beast. I'm thinking of starting a cult around him. Here's his code, but go read his post for the explanation. Go! Right now! I'll wait here.

    LukeH和完全LINQified RayTracer-认真的说,有人给这个人一些钱或热烈的握手之类的东西。 这是不真实的...这是LINQ的单行。 这意味着它是一种表达。 卢克(Luke)是惩罚的嘴,因为我仍在努力使自己的头脑与声明无关。 这个家伙是野兽。 我正在考虑开始对他进行崇拜。 这是他的代码,但是请阅读他的文章以获取解释。 走! 马上! 我在这里等

  • var pixelsQuery =
        from y in Enumerable.Range(0, screenHeight)
        let recenterY = -(y - (screenHeight / 2.0)) / (2.0 * screenHeight)
        select from x in Enumerable.Range(0, screenWidth)
               let recenterX = (x - (screenWidth / 2.0)) / (2.0 * screenWidth)
               let point = Vector.Norm(Vector.Plus(scene.Camera.Forward,                                                Vector.Plus(Vector.Times(recenterX, scene.Camera.Right),
                                                               Vector.Times(recenterY, scene.Camera.Up))))
               let ray = new Ray { Start = scene.Camera.Pos, Dir = point }
               let computeTraceRay = (Func<Func<TraceRayArgs, Color>, Func<TraceRayArgs, Color>>)
                (f => traceRayArgs =>
                 (from isect in
                      from thing in traceRayArgs.Scene.Things
                      select thing.Intersect(traceRayArgs.Ray)
                  where isect != null
                  orderby isect.Dist
                  let d = isect.Ray.Dir
                  let pos = Vector.Plus(Vector.Times(isect.Dist, isect.Ray.Dir), isect.Ray.Start)
                  let normal = isect.Thing.Normal(pos)
                  let reflectDir = Vector.Minus(d, Vector.Times(2 * Vector.Dot(normal, d), normal))
                  let naturalColors =                   from light in traceRayArgs.Scene.Lights
                      let ldis = Vector.Minus(light.Pos, pos)
                      let livec = Vector.Norm(ldis)
                      let testRay = new Ray { Start = pos, Dir = livec }
                      let testIsects = from inter in
                                           from thing in traceRayArgs.Scene.Things
                                           select thing.Intersect(testRay)
                                       where inter != null
                                       orderby inter.Dist
                                       select inter
                      let testIsect = testIsects.FirstOrDefault()
                      let neatIsect = testIsect == null ? 0 : testIsect.Dist
                      let isInShadow = !((neatIsect > Vector.Mag(ldis)) || (neatIsect == 0))
                      where !isInShadow
                      let illum = Vector.Dot(livec, normal)
                      let lcolor = illum > 0 ? Color.Times(illum, light.Color) : Color.Make(0, 0, 0)
                      let specular = Vector.Dot(livec, Vector.Norm(reflectDir))
                      let scolor = specular > 0 
                                   ? Color.Times(Math.Pow(specular, isect.Thing.Surface.Roughness), light.Color) 
                                   : Color.Make(0, 0, 0)
                      select Color.Plus(Color.Times(isect.Thing.Surface.Diffuse(pos), lcolor),
                                        Color.Times(isect.Thing.Surface.Specular(pos), scolor))
                  let reflectPos = Vector.Plus(pos, Vector.Times(.001, reflectDir))
                  let reflectColor =                   traceRayArgs.Depth >= MaxDepth
                      ? Color.Make(.5, .5, .5)
                      : Color.Times(isect.Thing.Surface.Reflect(reflectPos), 
                                    f(new TraceRayArgs(new Ray { Start = reflectPos, Dir = reflectDir }, 
                                                       traceRayArgs.Scene,                                                    traceRayArgs.Depth + 1)))
                  select naturalColors.Aggregate(reflectColor, (color, natColor) => Color.Plus(color, natColor)))                                  .DefaultIfEmpty(Color.Background).First())
               let traceRay = Y(computeTraceRay)
               select new { X = x, Y = y, Color = traceRay(new TraceRayArgs(ray, scene, 0)) };
    
    foreach (var row in pixelsQuery)
        foreach (var pixel in row)
            setPixel(pixel.X, pixel.Y, pixel.Color.ToDrawingColor());
    

    Feel free to send me links to cool source that you find hasn't been given a good read.

    随时向我发送指向很酷的资源的链接,您发现这些链接没有得到很好的阅读。

    翻译自: https://www.hanselman.com/blog/the-weekly-source-code-7

    知乎周源微信

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值