作为一个抬头,我正在学习C#,当我遇到这个障碍时,我正在阅读一本教科书。
如何从ElementAt
致电IEnumerable<T>
?
this中的第二条评论
所以问题提到它,但我只是得到一个错误。
Here他们也提到了这一点,但他们没有告诉你如何!
如果我遗漏了一些基本的东西,这是我的代码:
using System.Collections.Generic;
class Card {}
class Deck
{
public ICollection<Card> Cards { get; private set; }
public Card this[int index]
{
get { return Cards.ElementAt(index); }
}
}
我从MSDN Library page获得的信息中采用了这个:
class Deck
{
public ICollection<Card> Cards { get; private set; }
public Card this[int index]
{
get {
return System.Linq.Enumerable.ElementAt<Card>(Cards, index);
}
}
}
所有这些都来自关于集合的部分以及我展示的第二个代码实现如何更容易从列表中获取特定元素,而不必遍历枚举器。
Deck deck = new Deck();
Card card = deck[0];
而不是:
Deck deck = new Deck();
Card c1 = null;
foreach (Card card in deck.Cards){
if (condition for the index)
c1 = card;
}
我这样做是对吗还是我错过了什么?感谢您的任何意见!
答案 0 :(得分:8)
如果您想使用Linq extension methods,请确保在文件顶部包含System.Linq
命名空间:
using System.Collections.Generic;
using System.Linq; // This line is required to use Linq extension methods
class Card {}
class Deck
{
public ICollection<Card> Cards { get; private set; }
public Card this[int index]
{
get { return Cards.ElementAt(index); }
}
}
当然,扩展方法只是常规的旧方法,只需要一点点语法糖。你也可以这样称呼它们:
using System.Collections.Generic;
class Card {}
class Deck
{
public ICollection<Card> Cards { get; private set; }
public Card this[int index]
{
get { return System.Linq.Enumerable.ElementAt(Cards, index); }
}
}
答案 1 :(得分:1)
它被称为扩展方法。
确保您引用了System.Linq
。
然后执行Cards.ElementAt(index)
也许您想使用具有索引器的IList<T>
。
答案 2 :(得分:0)
&#34;简单&#34;答案是你应该宣布&#34; Deck&#34; as:IList(或者数组......在本次讨论中基本相同。)
&#34;更长&#34;答案在于&#34;什么是ICollection&#34; ... ICollection也是 (1)具有已知Count但没有已知(或保证)顺序的IEnumerable。 (想象一下一个数据存储,它知道计数,但在您读取数据之前不会修复订单。) -要么- (2)抽象,你知道计数并具有已知或可靠的顺序,但自然不具有随机访问权限......例如:堆栈或队列。
次区别是使用IndexAt(int n)表示#2是O(1)(非常快),但O(n)(慢)NOT O(1)表示#1。
所以,我的结论是,如果你想随机访问,那么选择你知道支持的数据结构(IList或Array,但不是ICollection)。