从CSDN的趣味题学C# 3.0 (转载)

两道算法趣味题:
  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版

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

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

 
 
ContractedBlock.gif ExpandedBlockStart.gif Code
"abcdefgabc"
    .GroupBy(c 
=> c)
    .ForEach(v 
=> Console.WriteLine(g.Key + "" + g.Count()));

  或者用上“狭义”LINQ?

 
 
ContractedBlock.gif ExpandedBlockStart.gif Code
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版:

 
 
ContractedBlock.gif ExpandedBlockStart.gif Code
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而已。

  最后,再附赠一个C#趣味编程。大家猜猜下面的代码输出什么?(暂时找不到了,一会儿补上)

转载于:https://www.cnblogs.com/zhangjerry/archive/2009/02/02/1382301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值