c#

位置:IT落伍者 >> c# >> 浏览文章

【C#】干掉for循环


发布日期:2020年05月25日
 
【C#】干掉for循环

在C系列语言中for循环扮演着重要的角色很难想象一百行C代码里面没有一个for循环(我有个朋友写了个几千行的算法没有用的for循环我当时很惊讶)就好比一百行中文里面没有一个可见for循环是代码的基本构造块由于for循环一般是用来对一串类型相同的对象进行操作的从侧面可以看出它经常伴随着数组而来的用比较通俗的话说for循环数组是黄金搭档

在里面引进了foreach循环它与for循环本质是相同的由于在foreach循环中省去了指标i(常常只用来取第i个项别无他用)很多人欣然接受了foreach循环毕竟没有夺走for循环它还在!

编程语言一直在进化先后经历了语言过程式语言面向对象语言总体来说越来越高级越来越抽象当代程序员可以不知道是啥就可以编程调用一个sort方法就排序了不知道用的是冒泡还是快速排序算法(外国人都帮我们弄好了!每当认识到差距超过这个事实我都好了不想伤心事了!)

在C# 引进了Extension Methods伴随而来的是一个新玩意儿Linq用实用工具Reflectorexe打开SystemCoredll中的 SystemLinq命名空间有个Enumerable静态类其中有大量的对数组操作的扩展方法(你能想到的基本都有不信就去看看!)

对于用惯了for循环的朋友如果要他/她停止使用肯定会觉得日子没法过了放心好了我不会劝他/她停止使用的就像戒烟一样都是自己的事(又一次跑题言归正传!)

下面我用代码来演示如何用扩展方法/Linq来干掉for循环

对于嵌套的for循环就用SelectMany!

声明for循环很好你可以继续用如果你想用的话如果你喜欢尝试新东西我想告诉你:这也许是应该的!

附录乘法口诀

x=

x=x=

x=x=x=

x=x=x=x=

x=x=x=x=x=

x=x=x=x=x=x=

x=x=x=x=x=x=x=

x=x=x=x=x=x=x=x=

x=x=x=x=x=x=x=x=x=

附录完整代码

代码

usingSystem;

usingSystemCollectionsGeneric;

usingSystemLinq;

usingSystemText;

usingNUnit;

namespaceKSharp

{

[TestFixture]

publicclassTestForLoop

{

[Test]

publicvoidOldSum()

{

intsum=;

for(inti=;i<;i++)

{

sum+=i;

}

AssertAreEqual(sum);

}

[Test]

publicvoidNewSum()

{

intsum=EnumerableRange()Sum();

intsum=EnumerableRange()Aggregate((xy)=>x+y);

intsum=EnumerableRange()Aggregate((xy)=>x+y);

AssertAreEqual(sum);

AssertAreEqual(sum);

AssertAreEqual(sum);

}

[Test]

publicvoidOldFilter()

{

int[]arr=new[]{};

List<int>odd_list=newList<int>();

for(inti=;i<arrLength;i++)

{

if(arr[i]%==)

{

odd_listAdd(arr[i]);

}

}

int[]odd_arr=odd_listToArray();

AssertThat(odd_arrIsEquivalentTo(newint[]{}));

}

[Test]

publicvoidNewFilter()

{

int[]arr=new[]{};

int[]odd_arr=arrWhere(x=>x%==)ToArray();

AssertThat(odd_arrIsEquivalentTo(newint[]{}));

}

[Test]

publicvoidOldMap()

{

int[]arr=new[]{};

List<int>new_list=newList<int>();

for(inti=;i<arrLength;i++)

{

new_listAdd(arr[i]*);

}

int[]new_arr=new_listToArray();

AssertThat(new_arrIsEquivalentTo(newint[]{}));

}

[Test]

publicvoidNewMap()

{

int[]arr=new[]{};

int[]new_arr=arrSelect(x=>x*)ToArray();

AssertThat(new_arrIsEquivalentTo(newint[]{}));

}

[Test]

publicvoidPrintMultiplicationFact()

{

ConsoleWrite(

x=\n

+x=x=\n

+x=x=x=\n

+x=x=x=x=\n

+x=x=x=x=x=\n

+x=x=x=x=x=x=\n

+x=x=x=x=x=x=x=\n

+x=x=x=x=x=x=x=x=\n

+x=x=x=x=x=x=x=x=x=\n

);

/*********************方法一:嵌套循环*************************/

for(intj=;j<;j++)

{

for(inti=;i<;i++)

{

if(i<=j)

{

ConsoleWrite({}x{}={}\tiji*j);

}

}

ConsoleWrite(\n);

}

/*********************方法二:扩展方法*************************/

EnumerableRange()

SelectMany(j=>EnumerableRange()(ji)=>new{ij})

Where(x=>xi<=xj)

Grouy(x=>xj)

Select(g=>gAggregate((ax)=>a+stringFormat({}x{}={}\txixjxi*xj)))

ToList()ForEach(x=>ConsoleWriteLine(x));

/*********************方法三:Linq表达式************************/

(

fromjinEnumerableRange()

fromiinEnumerableRange()

wherei<=j

groupnew{ij}byjintog

selectnew

{

LineNo=gKey

Line=gAggregate((ax)=>a+stringFormat({}x{}={}\txixjxi*xj))

}

)ToList()ForEach(g=>ConsoleWriteLine(gLine));

}

}

}

               

上一篇:C# 4.0中泛型协变性和逆变性详解

下一篇:.Net Framework下安装Windows服务