每周源代码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());

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