zoukankan      html  css  js  c++  java
  • 【转】从CSDN的趣味题学C# 3.0

    转自老赵博客:http://www.cnblogs.com/JeffreyZhao/archive/2009/02/01/1381867.html

    引文参见:从CSDN的趣味题学Python

    两道算法趣味题:

    1. 要求算一任意长度字符串中不同的字符以及它的个数。
    2. 把一段字符串用“右起竖排”的古文格式输出。

    引文用了Python来解这种趣味题,很有意思,Python也很适合。不过我看了看似乎这篇文章没有真正理解如今的C#可以怎么用,老赵一时兴起,也来设法做了一下。

    第1题

    Python版:

    dic = {}
    for s in "abcdefgabc":
        dic[s] = 1 if s not in dic else (dic[s]+1)
    print '\n'.join('%s,%s' % (k, v) for k, v in dic.items())

    C# 3.0版

    var values = "abcdefgabc"
        .GroupBy(c => c)
        .Select(g => String.Format("{0}, {1}", g.Key, g.Count()))
        .ToArray();
    Array.ForEach(values, v => Console.WriteLine(v));
    

    如果加上一个扩展——不写出来了,大家应该一看便知,老赵强烈推荐大家在项目中都要加上合适的扩展——再减少点行数:

    "abcdefgabc"
        .GroupBy(c => c)
        .ForEach(v => Console.WriteLine(g.Key + ", " + g.Count()));
    

    或者用上“狭义”LINQ?

    string text = "abcdefgabc";
    var result = from c in text group c by c into g select g;
    foreach g in result Console.WriteLine(g.Key + "," + g.Count());
    

    第2题

    Python版:

    def main(offset=6):
        string = u'静夜思 李白床前明月光,疑似地上霜。举头望明月,低头思故乡。090131'
        a = [[' ']*offset for row in xrange(offset)]
        for i in xrange(offset):
            for j in xrange(offset):
                a[i][j] = string[j + i*offset]
        b = [[r[col] for r in a[::-1]] for col in xrange(len(a[0]))]
        print '\n'.join([u'┊'.join(unicode(c) for c in row)for row in b])

    C# 3.0版:

    static void Print(string text, int offset)
    {
        var matrix = text
            .Select((c, i) => new { Char = c, Index = i })
            .GroupBy(c => c.Index % offset, c => c.Char.ToString());
        Array.ForEach(
            matrix.ToArray(),
            a => Console.WriteLine(String.Join("|", a.Reverse().ToArray())));
    }
    

    C# 3.0扩展版:

    static void Print(string text, int offset)
    {
        text
            .Select((c, i) => new { Char = c, Index = i })
            .GroupBy(c => c.Index % offset, c => c)
            .ForEach(g => Console.WriteLine(g.Reverse().Join("|")));
    }
    

    调用一下:

    Print("床前明月光疑似地上霜举头望明月低头思故乡", 5);

    结果:

    低|举|疑|床
    头|头|似|前
    思|望|地|明
    故|明|上|月
    乡|月|霜|光

    最后声明一下,本文并非为了挑起语言之争。Python是一门强大灵活的语言,学习Python有百利而无一害。Python还有一个好处,那就是 代码格式,至少缩进会非常的规范——没办法,在Python中缩进是语法的一部分,缩进不对直接导致代码运行不通过。代码格式一直不佳的朋友们可以尝试一 下。

    希望大家在掌握一门工具时把它用活,用好。C# 3.0中的高级特性更是大大提高开发效率的重要工具。其实这种“趣味编程”最关键的是“语言特性”,“语法”而不是其中包含的类库功能。其实Java也有 内联写法,可以写的很短,说Java要20行以上——那只是不知道怎么“活用”Java而已。

  • 相关阅读:
    ASP.NET面试题2
    [转]深入.NET DataTable
    C#操作Excel (转)
    XML操作大全
    j2sdk 好用了
    我对“重构(refector)”的看法
    成功执行
    java属性类(Properties类)
    Sharpdevelop下载
    POJ 1753 Flip Game(翻转棋盘+枚举+dfs)
  • 原文地址:https://www.cnblogs.com/kidfruit/p/2329878.html
Copyright © 2011-2022 走看看