公共课项{...}
public class Order
{
public List<Item> Items
...
}
public class Customer
{
public List<Order> Orders
...
}
Run Code Online (Sandbox Code Playgroud)
现在,使用LINQ我需要获得客户购买的所有商品.我怎么能够?
我尝试了类似var items = from o in cust.Orders select o.Items;但结果是IEnuberable<List<Item>>,我只想一个IEnumerable<Item>.
我在这里要求尽量避免编码2个循环.
更新:为了所有阅读本文的人的利益,自.NET 4起,由于自动生成事件同步的变化,锁定是不必要的,所以我现在就使用它:
public static void Raise<T>(this EventHandler<T> handler, object sender, T e) where T : EventArgs
{
if (handler != null)
{
handler(sender, e);
}
}
Run Code Online (Sandbox Code Playgroud)
并提出它:
SomeEvent.Raise(this, new FooEventArgs());
Run Code Online (Sandbox Code Playgroud)
在阅读过Jon Skeet 关于多线程的文章之后,我试图将他提倡的方法封装在像这样的扩展方法中引发事件(使用类似的通用版本):
public static void Raise(this EventHandler handler, object @lock, object sender, EventArgs e)
{
EventHandler handlerCopy;
lock (@lock)
{
handlerCopy = handler;
}
if (handlerCopy != null)
{
handlerCopy(sender, e);
}
}
Run Code Online (Sandbox Code Playgroud)
然后可以这样调用:
protected virtual void OnSomeEvent(EventArgs e)
{
this.someEvent.Raise(this.eventLock, this, e);
}
Run Code Online (Sandbox Code Playgroud)
这样做有什么问题吗? …
C#Collections库中是否有任何数据结构,其中结构的修改不会使迭代器失效?
考虑以下:
List<int> myList = new List<int>();
myList.Add( 1 );
myList.Add( 2 );
List<int>.Enumerator myIter = myList.GetEnumerator();
myIter.MoveNext(); // myIter.Current == 1
myList.Add( 3 );
myIter.MoveNext(); // throws InvalidOperationException
Run Code Online (Sandbox Code Playgroud) 在MSDN上,我发现在抽象方法声明中使用"虚拟"修饰符是错误的.我的一位同事应该是非常有经验的开发人员,但在他的代码中使用了这个:
public abstract class BusinessObject
{
public virtual void Render(){}
public virtual void Update(){}
}
Run Code Online (Sandbox Code Playgroud)
它也正确与否?
为什么这不起作用?
find . -maxdepth 1 -type f -print0 | xargs -0 .
Run Code Online (Sandbox Code Playgroud)
我得到的只是xargs: .: Permission denied.
是否有一个很好的资源可以解释枚举器和自定义枚举器的概念?特别是有一个很好的例子,说明为什么你想要IEnumerable自己实现以及如何有效地使用它?
我偶尔会碰到yield,我正试图更好地理解它.
单个调度的问题对于使用Java和C#等静态类型语言进行编码的人来说大多是熟悉的.基本思路是:
虽然运行时多态性允许我们根据类型(运行时类型)调度到正确的方法调用receiver,例如:
IAnimal mything = new Cat();
mything.chop();
Run Code Online (Sandbox Code Playgroud)
方法调用将根据运行时类型执行mything,即Cat.这是单一调度功能(存在于Java/C#中).
现在,如果您不仅需要调度接收器的运行时类型,还需要调度(多个)参数的类型,那么您将面临一个小问题:
public class MyAcceptor {
public void accept (IVisitor vst) {...}
public void accept (EnhancedConcreteVisitor vst) {...}
}
Run Code Online (Sandbox Code Playgroud)
第二种方法永远不会被调用,因为在我们的"消费者"代码中,我们倾向于通过常见的超类型或接口来处理不同类型的对象(在我的示例中为访问者).
这就是我问的原因 - 因为动态类型允许多重调度多态,C#4.0有动态关键字;)
我正在编写一个程序,必须记录启动记事本等过程的时间.我认为创建一个每秒检查所有进程的Timer是很好的.但我认为它会减慢用户的计算机速度.有没有更好的方法呢?
我正在尝试生成一个图,其中y轴有主网格线和次网格线,而x轴只有主网格线.
它足够简单,可以禁用两个轴上的小网格线,如下所示:
axes.grid(False, which='minor')
Run Code Online (Sandbox Code Playgroud)
但我找不到一种方法只将其应用于一个轴.我错过了什么吗?