我对c#中的yield关键字有一个模糊的理解,但我还没有看到在我的代码中使用它的必要性.这可能源于对它缺乏了解.
那么,一些典型的好用法是yield什么?
我有一个将对象映射到对象的类,但与字典不同,它以两种方式映射它们.我现在正在尝试实现迭代值的自定义IEnumerator接口.
public class Mapper<K,T> : IEnumerable<T>, IEnumerator<T>
{
C5.TreeDictionary<K,T> KToTMap = new TreeDictionary<K,T>();
C5.HashDictionary<T,K> TToKMap = new HashDictionary<T,K>();
public void Add(K key, T value)
{
KToTMap.Add(key, value);
TToKMap.Add(value, key);
}
public int Count
{
get { return KToTMap.Count; }
}
public K this[T obj]
{
get
{
return TToKMap[obj];
}
}
public T this[K obj]
{
get
{
return KToTMap[obj];
}
}
public IEnumerator<T> GetEnumerator()
{
return KToTMap.Values.GetEnumerator();
}
public T Current
{
get { throw new NotImplementedException(); }
} …Run Code Online (Sandbox Code Playgroud) 我注意到List<T>它将枚举器定义为a struct,同时ArrayList将其枚举器定义为class.有什么不同?如果我要为我的班级写一个调查员,哪一个更好?
编辑:我的要求无法使用yield,所以我正在实现我自己的枚举器.也就是说,我想知道是否更好地遵循这些方法List<T>并将其作为结构实现.
我希望能够对我最近在调试器中完成的一个片段做一些澄清,但是根本无法理解.
我正在PluralSight上学习C#课程,目前的主题是关于并使用关键字返回a .yieldIEnumerable<T>
我有这个过于基本的函数,它返回一个(一个带有的简单类,和)的IEnumerable集合:VendorsIdCompanyNameEmail
public IEnumerable<Vendor> RetrieveWithIterator()
{
this.Retrieve(); // <-- I've got a breakpoint here
foreach(var vendor in _vendors)
{
Debug.WriteLine($"Vendor Id: {vendor.VendorId}");
yield return vendor;
}
}
Run Code Online (Sandbox Code Playgroud)
我在单元测试中得到了这个代码,我用它来测试函数:
var vendorIterator = repository.RetrieveWithIterator(); // <-- Why don't it enter function?
foreach (var item in vendorIterator) // <-- But starts here?
{
Debug.WriteLine(item);
}
var actual = vendorIterator.ToList();
Run Code Online (Sandbox Code Playgroud)
我真的无法理解,我确信很多初学者都遇到了同样的问题,这就是为什么初始调用RetrieveWithIterator不会启动函数,而是在我们开始迭代其返回的IEnumerable集合时开始(见评论).
我有一个暴露内部IList <>的类属性
System.Collections.ObjectModel.ReadOnlyCollection<>
Run Code Online (Sandbox Code Playgroud)
如何在ReadOnlyCollection<>不将元素复制到新数组的情况下传递其中的一部分(我需要实时视图,而目标设备内存不足)?我的目标是Compact Framework 2.0.
仍然试图找到我在实际情况下使用"yield"关键字的位置.
我在这个主题上看到了这个主题
但是在接受的答案中,他们将此作为一个例子,其中某人正在迭代Integers()
public IEnumerable<int> Integers()
{
yield return 1;
yield return 2;
yield return 4;
yield return 8;
yield return 16;
yield return 16777216;
}
Run Code Online (Sandbox Code Playgroud)
但为什么不用
list<int>
Run Code Online (Sandbox Code Playgroud)
在这里.似乎更直截了当..
首先,我已经搜索了这个,但我仍然无法理解何时使用yield.
例如,我有以下代码:
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
yield return days[i];
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码和下面的代码之间有什么区别?
string[] days = { "Sun", "Mon", "Tue", "Wed", "Thr", "Fri", "Sat" };
public System.Collections.IEnumerator GetEnumerator()
{
for (int i = 0; i < days.Length; i++)
{
return days[i];
}
}
Run Code Online (Sandbox Code Playgroud)
你能告诉我什么时候使用产量吗?
根据我对接口的理解,为了使用它们,你必须通过在冒号后面添加接口的名称来声明一个类正在实现它,然后实现这些方法.
我目前正在学习枚举器,IEnumerable等等,这让我很困惑.这是我的意思的一个例子:
static IEnumerable<int> Fibs(int fibCount)
{
for (int i = 0, prevFib = 1, curFib = 1; i < fibCount; i++) {
yield return prevFib;
int newFib = prevFib + curFib;
prevFib = curFib;
curFib = newFib;
}
}
Run Code Online (Sandbox Code Playgroud)
IEnumerable似乎是一个普通的接口,我甚至检查了方法定义,这就是它的样子.
我怎么可能在方法定义中使用接口作为类型/返回类型,何时/如何知道我应该使用某些接口作为此示例中的类型?
编辑:我真的怀疑它与yield关键字有什么关系,因为很多接口都以这种方式用作属性,例如在模型中的MVC中,并像它一样传递给Views.例:
public IEnumerable<Category> Categories {get;set;}
Run Code Online (Sandbox Code Playgroud) c# ×9
.net ×4
yield ×3
ienumerable ×2
yield-return ×2
.net-2.0 ×1
asp.net ×1
collections ×1
enumeration ×1
interface ×1
iterator ×1