贴一个Linq使用小例子

以专业开发人员为伍 2008-09-04 06:41:11
加精
linq提供了lamd表达方法,我使用它已经是家常便饭。这里show两端代码。

在我的一个测试驱动引擎系统中,它首先要检查当前应用程序域中的程序集,把那些有可能包含测试程序的(他们都引用了包含测试程序的程序集的dll)挑出来。之后,它要便利这些assembly,查找各个class,找出所有没有参数没有返回值并且声明为static的方法,这些方法还应该贴有RunTestAttribute这个标签,这两段程序我可以及这样简单地写出:


public class TestRunner
{
private List<Assembly> _assemblies = new List<Assembly>();

private List<Pair> _TestProcs = null;

/// <summary>
/// 从测试程序集中找出的测试用例。可以通过修改此集合内容自定义测试用例。
/// </summary>
public List<Pair> TestProcs
{
get
{
if (_TestProcs == null)
{
_TestProcs = new List<Pair>();
_assemblies.ForEach(asm =>
asm.GetTypes()
.ForEach(t => t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static)
.Where(m => m.ReturnParameter.ParameterType == typeof(void) && m.GetParameters().Length == 0)
.ForEach(m =>
{
var att = m.GetCustomAttributes(typeof(RunTestAttribute), false);
if (att.Length != 0)
{
RunTestAttribute attr = att[0] as RunTestAttribute;
if (attr.TimeStamp >= this.MinTime && attr.TimeStamp <= this.MaxTime)
for (var n = 0; n < attr.实例数 * this.FuckTimes; n++)
TestProcs.Add(new Pair()
{
Proc = (ThreadStart)Delegate.CreateDelegate(typeof(ThreadStart), m),
Attr = attr
});
}
})));
}
return _TestProcs;
}
}

public TestRunner()
{
var thisAsmName = Assembly.GetExecutingAssembly().GetName().Name;
AppDomain.CurrentDomain.GetAssemblies()
.Where(asm => asm.GetReferencedAssemblies().Any(a => a.Name == thisAsmName))
.ForEach(asm => _assemblies.Add(asm));
}

.................


大家都知道,Where这个Linq方法它并不是创建另一数据或者List,而是使用c#枚举器方法一次仅返回一个结果,因此上述所有对IEnumable<T>的操作其实都是“狗熊掰棒子”一样处理内存对象创建,而不是生成大量数据集合。所以我觉得Linq大多数方法用的越多则越是能从枚举代替数据的编程风格中获得性能提高。

另外,ForEach我是这样写的:

static public void ForEach<T>(this IEnumerable<T> array, Action<T> action)
{
foreach (T x in array)
{
action(x); ;
}
}


我其实就是这样写我的代码的,使用lamda表达方式这已经成了我的习惯。
...全文
2440 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
永动bug制造机 2011-08-24
  • 打赏
  • 举报
回复
sanmi 2011-02-12
  • 打赏
  • 举报
回复
强烈留名
yanzhiyuan928 2010-02-07
  • 打赏
  • 举报
回复
顶下了
lfywy 2009-05-15
  • 打赏
  • 举报
回复
学习
kx_long 2009-02-12
  • 打赏
  • 举报
回复
认真学习
Vming00 2009-01-13
  • 打赏
  • 举报
回复
不懂...帮UP....
fellowcheng 2008-09-27
  • 打赏
  • 举报
回复
学习
betbuy 2008-09-15
  • 打赏
  • 举报
回复
顶一个
greenery 2008-09-12
  • 打赏
  • 举报
回复
学习中
laihaibin08 2008-09-12
  • 打赏
  • 举报
回复
学习了
starsong 2008-09-12
  • 打赏
  • 举报
回复
mark
Dhoopu 2008-09-12
  • 打赏
  • 举报
回复
楼主多多指教哟。
Dhoopu 2008-09-12
  • 打赏
  • 举报
回复
正在学习LINQ 这玩意啊,:-)
seeupseeup 2008-09-12
  • 打赏
  • 举报
回复
学习学习
bnnhyy6 2008-09-11
  • 打赏
  • 举报
回复
风过了算了~~~~~~~~~~~
宝_爸 2008-09-11
  • 打赏
  • 举报
回复
好东西,顶。
radhot 2008-09-11
  • 打赏
  • 举报
回复
lz结构很清晰, 做程序就应该学会分享。 赞!
bluedoctor 2008-09-11
  • 打赏
  • 举报
回复
谢谢楼主,不知道我原来的问题现在用LinQ是否可以实现了呢?

public class A
{
int P1{
get{return 0;}
set{}
}
int P2
{
get{return 1;}
set{}
}
}

public class B
{
public static void Main()
{
B b=new B();
B.Show((new A()).P1);
B.Show((new A()).P2);
B.Show(999);
}
public void Show(int who)
{
//这里我想知道 who是谁?linQ不是说可以延迟求值吗?我想做到if(who==A.P1){do1()}else if(who==A.P2){do2()}
//有办法吗?
}
}
SeeSunSet 2008-09-11
  • 打赏
  • 举报
回复
this.FuckTimes 是何意?
asd15990026263 2008-09-11
  • 打赏
  • 举报
回复
顶~顶~
加载更多回复(80)

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧