我有一个具有IEnumerable属性的类(ClassA).然后我有另一个具有相同属性的类(ClassB).他们正在共享一个接口(InterfaceA).ClassB基本上是多个ClassA的容器类.如何为ClassB实现该属性.
interface InterfaceA
{
IEnumerable<int> MyInts
{
get;
}
}
class ClassA : InterfaceA
{
public IEnumerable<int> MyInts
{
get;
private set;
}
}
class ClassB : InterfaceA
{
ClassA[] classAs = new ClassA[10];
public IEnumerable<int> MyInts
{
get
{
//What goes here ?
classAs.SelectMany(classA => classA.MyInts);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用LINQ select语句,但这不起作用.
编辑:看起来我看起来不够努力.答案就在这个问题上. 如何聚合T的多个IEnumebles
编辑2:包含适合我的示例代码,包括其他人需要它.
使用反射器我注意到该System.Linq.Enumerable.Count方法有一个条件来优化它,因为IEnumerable<T>传递实际上是一个ICollection<T>.如果转换成功,则Count方法不需要迭代每个元素,但可以调用ICollection的Count方法.
基于此,我开始认为IEnumerable<T>可以像集合的只读视图一样使用,而不会出现我最初基于API的性能损失.IEnumerable<T>
我感兴趣的是,Count当IEnumerable<T>a是一个Select语句的结果时,仍然保持优化ICollection,但是基于反映的代码,这种情况没有被优化,并且需要遍历所有元素.
你从反射器得出相同的结论吗?缺少这种优化背后的原因是什么?我似乎在这个常见的操作中浪费了很多时间.即使可以在不这样做的情况下确定Count ,规范是否要求评估每个元素?
如何启用我的BLL的自动排序,返回列表,CustomerList:GridView中的列表?
Customer是我自己的强类型类,CustomerList是客户列表.
我知道一种方法是在GridView中将AllowSorting属性设置为true并处理OnSorting事件并调用在CustomerList类中定义的排序方法.
但是我想要一个自动解决方案,我不需要处理OnSorting事件,它应该像GridView如何处理DataView,DataTable和DataSet的自动排序.
我需要在CustomerList或Customer类上实现一个能够实现该功能的接口吗?
alt text http://img260.imageshack.us/img260/3373/aa479347gridviewfg21enu.gif
我有一个简单的值类型:
[Serializable]
private struct TimerInstance
{
public TimerInstance(string str, long nTicks)
{
_name = str;
_ticks = nTicks;
}
private readonly string _name;
private readonly long _ticks;
public string Name { get { return _name; } }
public long Ticks { get { return _ticks; } }
public override string ToString()
{
return string.Format("{0,20}: {1,10:N}", Name, Ticks);
}
}
Run Code Online (Sandbox Code Playgroud)
你会注意到它是可序列化的.然后我列出了这些:
static private List<TimerInstance> _Timers = new List<TimerInstance>();
Run Code Online (Sandbox Code Playgroud)
和一个LINQ方法,从列表中消除最低5%和前5%的计时器:
// Return items that should be persisted. By convention, we are eliminating …Run Code Online (Sandbox Code Playgroud) 我有一系列元素.该序列只能迭代一次并且可以是"无限的".
获得这样一个序列的头部和尾部的最佳方法是什么?
IEnumerable在您不需要实际添加或删除内容但仅枚举它们时,使用应用程序范围是一个好习惯吗?
侧问题:你曾经有返回任何问题,IEnumerable<T>从WCF服务?这会给客户端应用程序带来问题吗?毕竟,我认为这将序列化为一个数组.
我正在使用HtmlAgilityPack和C#来解析一些HTML.
<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>
<div id="post-8266">
<div class="ruler"> </div>
Run Code Online (Sandbox Code Playgroud)
基本上,我有这些元素,每个元素都在自己的对象中,在IEnumerable中.
是否有一种优雅的方式来获取集合中的每个N/2元素.意思是,用课跳过每个div .ruler?
我需要遍历生成的集合,因此要么将每个找到的对象复制到新的IEnumerable中,要么在foreach函数中使用它内联.
例如:
//Copying resulting set to new IEnumerable<T>:
var odds = elements.SelectOdds();
//Using it inline for my usage:
foreach (var x in elements.SelectOdds())
{
}
Run Code Online (Sandbox Code Playgroud)
哪种选择最好,我怎样才能做到这一点?
虽然学习C#非常快,但我对这个Collection语法问题感到磕磕绊绊.
我将自己类型MyItem的一些对象添加到listbox lstData.现在我需要在这个列表框中搜索并想到使用优雅的LINQ表示法,如:
lstData.Items.Where(x => x.Text == SearchString)
Run Code Online (Sandbox Code Playgroud)
但是列表框的项目没有.Where(),尽管我确实包含了"using System.Linq;" 命名空间.
所以我尝试过:
foreach (MyItem item in (MyItem)lstData.Items)
Run Code Online (Sandbox Code Playgroud)
但这会产生构建错误:无法将类型'System.Windows.Forms.ListBox.ObjectCollection'转换为'MySandbox.frmListboxDemo.MyItem'.
我确实设法写了一些可行的东西:
for (int i = 0; i < lstData.Items.Count; i++)
{
MyItem item = (MyItem)lstData.Items[i];
if (item.Text == SearchString)
{
lstData.SetSelected(i, true);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
和类似的版本:
var item_enum = lstData.Items.GetEnumerator();
while (item_enum.MoveNext()) { etc etc... }
Run Code Online (Sandbox Code Playgroud)
结果证明是2行更长,并且没有找出什么可以取代'var'.
我不太确定我是否理解如何使用Collections,ObjectCollections,Enumerators等,但我很想学习.特别是如果.here()版本是可能的和/或更好的.
谢谢你的所有答案.我最终得到了这个解决方案:
var item_iter = lstData.Items.Cast<MyItem>()
.Where(x => x.Text.Trim().ToLower() == txtItemName.Text);
foreach (MyItem item in item_iter)
{
int i = lstData.Items.IndexOf(item);
lstData.SetSelected(i, true);
break;
} …Run Code Online (Sandbox Code Playgroud) 你如何确定方法是否应该返回IEnumerable<T>或IObservable<T>?
为什么我会选择一种范式而不是另一种?
的编译器生成实施的IEnumerator/ IEnumerable用于yield方法和吸气剂似乎是一个类,因此,被分配在堆上.但是,其他.NET类型例如List<T>专门返回struct枚举器以避免无用的内存分配.通过对C#In Depth帖子的快速概述,我认为没有理由说这也不是这里的情况.
我错过了什么吗?