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而已。

  • 相关阅读:
    HBase 高性能加入数据
    Please do not register multiple Pages in undefined.js 小程序报错的几种解决方案
    小程序跳转时传多个参数及获取
    vue项目 调用百度地图 BMap is not defined
    vue生命周期小笔记
    解决小程序背景图片在真机上不能查看的问题
    vue项目 菜单侧边栏随着右侧内容盒子的高度实时变化
    vue项目 一行js代码搞定点击图片放大缩小
    微信小程序进行地图导航使用地图功能
    小程序报错Do not have xx handler in current page的解决方法
  • 原文地址:https://www.cnblogs.com/kidfruit/p/2329878.html
Copyright © 2011-2022 走看看