每周源代码7


[原文发表地址]The Weekly Source Code 7

[原文发表时间] 2011-02-15 02:47 AM

最近我都在探索阅读别人的代码以使自己进步,这一“每周代码”系列总数未知,这是第七篇。以下是我这周在读的很欣赏的一些代码 。

我被最近的ALT.NET会议小小地牵制住了,所以请原谅我上周没有能继续这个系列。

Joe Cheng’s在C#3.0中的 Schwartzian 转换 – 当有人知道了一项技术的正式名称,象棋也好,代码也好,他们通常都比我聪明。“你在对我做Bonetti防守,对吧?”Joe就是其中一个。

Schwartzian转换是什么?它是一种根据可能计算量很大的属性对对象高效排序的方法。比如,你有一个文件名数组,并且你想按照最终修改日期来排序”这是一项非常有用的技术,在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– 这有一点老了,不过读起来仍很有趣。如果你正考虑对公司的对象或web服务上实现LINQ,这是一个很好的起点。你需要自己去深入了解,不过这里有些有趣的代码。还要注意,这个代码很老,我没有找到最新版本的。我把它叫做左手/右手代码,在这个例子中,我们一只手拉入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– 哇,Atom 1.0OPML 2.0RSD 1. 0,和RSS 2.0同步格式的完全实现。如果你在找一些同步的代码,那就不用找了,就是它了。这一代码不仅非常工整,还有很好的结构,有趣的扩展机制可以在你的同步格式里包括其他的命名空间。不过,我不是知道测试在哪里,显然工作量很大,或者有很多的代码需要生成。

代码太多,不能复制在此,但让我不小心点过去的是个没有听说过的新属性。你可以告诉FxCop去休息了,因为这里有这样的命名规则。

[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Rss")]
public class RssFeedCreatedEventArgs : EventArgs, IComparable {…

LukeH 和完全LINQ化的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());

如果找到那些还没有被人好好读过的源代码,请告诉我链接。

Comments (0)

Skip to main content