代码之家  ›  专栏  ›  技术社区  ›  Colin Pickard

用于学习的复杂C#

c#
  •  3
  • Colin Pickard  · 技术社区  · 14 年前

    我试着阅读一些别人的代码,既帮助我学习C#,也纯粹是为了培养我理解别人代码的能力,但我在网上发现的很多东西都很长,而且相对简单。我想知道是否有人能给我指出一些简短但更复杂的东西,最好包括不太常见的语言用法。

    9 回复  |  直到 14 年前
        1
  •  4
  •   Community Egal    7 年前

    Eric Lippert 最近写了一系列关于 graph colouring on his blog . 这很可能是让你埋头苦干的事情,因为这是一个由多部分组成的系列,当他解释图形着色的过程时,你应该可以从简单的触摸到大脑的触摸

        2
  •  3
  •   Quentamia    14 年前

    我建议你看看那些有效的教科书。他们会帮助你学习更复杂的语言用法。

        3
  •  3
  •   Oded    14 年前

    mono source code -许多BCL类都实现了,您一定会学到一些东西:)

    下面是我脑海中的一些想法:

        4
  •  2
  •   Matthew Whited    14 年前

    退房 Coding4Fun . 它是.Net语言的混合体,一些(大多数)项目非常酷。 XNA Creators Club

        5
  •  2
  •   Winston Smith    14 年前

    Raytracing in one LINQ statement 从卢克·霍班的博客中,我立刻想到了。

        6
  •  2
  •   Wallace Breza    14 年前

    看一看这个 .NET framework程序集 使用 .NET Reflector . 里面有很多很棒的东西,在我学习的过程中帮了我很多。

    很多次我都在想微软是如何在这个框架中做某些事情的,我很容易就能在他们的源代码中找到答案。

        7
  •  1
  •   ChaosPandion    14 年前

    private Element ReadMemberExpression()
    {
        var queue = new Queue<Element[]>();
        var newDepth = 0;
        var argsCount = 0;
        _scanner.CreateRestorePoint();
        while (true)
        {
            _scanner.CreateRestorePoint();
            {
                var a = ReadArguments();
                if (a != null)
                {
                    argsCount++;
                    if (argsCount > newDepth)
                    {
                        _scanner.Restore();
                        break;
                    }
                    queue.Enqueue(new[] { default(Element), default(Element), a });
                    _scanner.DeleteRestorePoint();
                    continue;
                }
            }
            _scanner.DeleteRestorePoint();
    
            var pe = ReadPrimaryExpression();
            if (pe != null)
            {
                queue.Enqueue(new[] { pe });
                continue;
            }
    
            var fe = ReadFunctionExpression();
            if (fe != null)
            {
                queue.Enqueue(new[] { fe });
                continue;
            }
    
            if (_scanner.MatchNext(Grammar.New))
            {
                newDepth++;
                queue.Enqueue(new[] { Grammar.New });
            }
            else if (_scanner.Match(Grammar.LeftSquareBracket))
            {
                var e = ReadExpression();
                if (e == null)
                {
                    throw new ParseException();
                }
                if (!_scanner.MatchNext(Grammar.RightSquareBracket))
                {
                    throw new ParseException();
                }
                queue.Enqueue(new[]{default(Element), Grammar.LeftSquareBracket, e, Grammar.RightSquareBracket});
            }
            else if (_scanner.Match(Grammar.FullStop))
            {
                if (!_scanner.MatchNext(ElementType.IdentifierName))
                {
                    throw new ParseException();
                }
                queue.Enqueue(new[] { default(Element), Grammar.FullStop, _scanner.Current });
            }
            else
            {
                _scanner.Unwind();
                break;
            }
        }
        if (queue.Count == 0)
        {
            _scanner.DeleteRestorePoint();
            return null;
        }
        else
        {
            var element = default(Element);
            var children = queue.Dequeue();
            while (children[0] == Grammar.New)
            {
                children = queue.Dequeue();
            }
            element = new Element(ElementType.MemberExpression, children);
            while (queue.Count > 0)
            {
                children = queue.Dequeue();
                if (children.Length == 3 && children[2].Type == ElementType.Arguments)
                {
                    newDepth--;
                    children[0] = Grammar.New;
                    children[1] = element;
                    element = new Element(ElementType.MemberExpression, children);
                }
                else
                {
                    children[0] = element;
                    element = new Element(ElementType.MemberExpression, children);
                }
            }
            if (newDepth > 0)
            {
                _scanner.Restore();
                return null;
            }
            _scanner.DeleteRestorePoint();
            return element;
        }
    }
    
        8
  •  1
  •   mqp    14 年前

    这并不十分复杂,但可能只是简单的娱乐——Mads Torgersen在C中实现了一个定点组合器:

    http://blogs.msdn.com/b/madst/archive/2007/05/11/recursive-lambda-expressions.aspx

        9
  •  0
  •   Brandon Boone    14 年前

    这可能是一个明显的建议,但我会检查上的文章 CodeProject.com . 您可以搜索与C#相关的特定文章,贡献者通常会很好地解释他们的代码。

    Mandelbrot set in C# (尽管这可能没有你想要的那么复杂)。

    除此之外,我会在任何 C# opensource projects 你可以通过谷歌找到。