Tag: yield return

如何使用yield return和recursion获取每个字母组合?

我有几个字符串列表,从几十个可能的列表: 1: { “A”, “B”, “C” } 2: { “1”, “2”, “3” } 3: { “D”, “E”, “F” } 这三个仅作为示例选择,并且用户可以从具有不同数量的元素的数十个类似列表中进行选择。 再举一个例子,这对用户来说也是一个非常有效的选择: 25: { } // empty 4: { “%”, “!”, “$”, “@” } 16: { “I”, “a”, “b”, “Y” } 8: { “)”, “z”, “!”, “8” } 我想要做的是在保持列表的“顺序”的同时获得每个字符串组合。 换句话说,假设我们正在查看第一个列表,第一个组合将是A1D ,然后是A1E ,然后是A1F ,然后是B1D ,然后是B1E ,依此类推。 到目前为止,我已经编写了这个递归算法: […]

具有IDisposable的无限状态机

假设我有一个无限状态机来生成随机md5哈希: public static IEnumerable GetHashes() { using (var hash = System.Security.Cryptography.MD5.Create()) { while (true) yield return hash.ComputeHash(Guid.NewGuid().ToByteArray()); } } 在上面的例子中,我使用using语句。 是否会调用.Dispose()方法? CQ,未管理的资源是否会被释放? 例如,如果我按如下方式使用机器: public static void Test() { int counter = 0; var hashes = GetHashes(); foreach(var md5 in hashes) { Console.WriteLine(md5); counter++; if (counter > 10) break; } } 由于hashes变量将超出范围(并且我假设已收集垃圾),是否会调用dispose方法来释放System.Security.Cryptography.MD5使用的资源,或者这是内存泄漏?

使用IDisposable资源产生

是否有通过可支配资源获得收益的适当方式? 返回的对象是IDisposable,但它迭代的元素是。 这是一个例子: public static IEnumerable Fetch(IEnumerable ids) { using (var client = new CouchbaseClient()) { yield return ids.Select(s => s.ToString()); } } 现在,调用它不会处理获得的using资源。 我知道我可以只是一个ToList并立即返回它,但有没有办法处理这个“正确”,或者我必须在IDisposable资源上保留一个标签并在我完成后手动处理它?

用于包装抛出API的.NET迭代器

我有一个带有API的类,它允许我询问对象,直到它抛出IndexOutOfBoundsException 。 我想将它包装到迭代器中,以便能够编写更清晰的代码。 但是,我需要捕获exception以停止迭代: static IEnumerable Iterator( ExAPI api ) { try { for( int i = 0; true; ++i ) { yield return api[i]; // will throw eventually } } catch( IndexOutOfBoundsException ) { // expected: end of iteration. } } 但… 与expression一起使用时,yield return语句不能出现在catch块或具有一个或多个catch子句的try块中。 有关更多信息,请参阅exception处理语句(C#参考).Statements(C#参考)。 (来自msdn ) 我怎么还能包装这个api?

C#中的收益率是否是线程安全的?

我有以下代码: private Dictionary items = new Dictionary; public IEnumerable Keys { get { foreach (object key in items.Keys) { yield return key; } } } 这是线程安全的吗? 如果不是,我必须lock循环或yield return ? 这就是我的意思: Thread1访问Keys属性,而Thread2将一个项添加到基础字典。 Thread1是否受Thread2的影响?

不使用,foreach或手动调用Dispose()时的枚举器处理

我正在使用yield return迭代SqlDataReader的记录: IEnumerable GetReadings() { using (var connection = new SqlConnection(_connectionString)) { using (var command = new SqlCommand(_query, connection)) { connection.Open(); using (var reader = command.ExecuteReader()) { while (reader.Read()) { yield return new Reading { End = reader.GetDateTime(0), Value = reader.GetDouble(1) }; } } connection.Close(); } } } 然后我使用这个被接受的答案的改编版本来“拉”许多迭代器: var enumerators = data.Select(d => new […]

我想知道迭代数据读取器对象时’yield’的连接状态和对代码性能的影响

这是我用来从数据库中获取数据的示例代码:在DAO层: public IEnumerable GetDATA(ICommonSearchCriteriaDto commonSearchCriteriaDto) { using(DbContext) { DbDataReader reader = DbContext.GetReader(“ABC_PACKAGE.GET_DATA”, oracleParams.ToArray(), CommandType.StoredProcedure); while (reader.Read()) { yield return reader; } } } 在BO层我调用上面的方法,如: List GridDataDtos = MapMultiple(_costDriversGraphDao.GetGraphData(commonSearchCriteriaDto)).ToList(); 在mapper层上MapMultiple方法的定义如下: public IGridDataDto MapSingle(IDataRecord dataRecord) { return new GridDataDto { Code = Convert.ToString(dataRecord[“Code”]), Name = Convert.ToString(dataRecord[“Name”]), Type = Convert.ToString(dataRecord[“Type”]) }; } public IEnumerable MapMultiple(IEnumerable dataRecords) { return […]

在C#中使用yield

我对c#中的yield关键字有一个模糊的理解,但我还没有看到在我的代码中使用它的必要性。 这可能源于对它缺乏了解。 那么, yield一些典型的好用法是什么?

如何处理“无限”IEnumerable?

“无限”IEnumerable的一个简单例子 IEnumerable Numbers() { int i=0; while(true) { yield return unchecked(i++); } } 我知道 foreach(int i in Numbers().Take(10)) { Console.WriteLine(i); } 和 var q = Numbers(); foreach(int i in q.Take(10)) { Console.WriteLine(i); } 两者都工作正常(并打印出数字0-9)。 但是在复制或处理像q这样的表达式时是否有任何陷阱? 我可以依赖这样一个事实,即它们总是被评估为“懒惰”吗? 产生无限循环有危险吗?

为什么我们不能为以下代码调试带有yield return的方法?

以下是我的代码: class Program { static List MyList; static void Main(string[] args) { MyList = new List() { 1,24,56,7}; var sn = FilterWithYield(); } static IEnumerable FilterWithYield() { foreach (int i in MyList) { if (i > 3) yield return i; } } } 我在FilterWithYield方法中有一个断点,但它根本没有达到断点。 我在调用点有一个中断,即var sn = FilterWithYield(); 控制命中此点并在调试窗口中正确显示结果。 但是为什么控制不在FilterWithYield方法中停止? 还有一个问题。 我读到yield将数据返回给调用者。如果将FilterWithYield方法的返回类型更改为int则通过error实现。如果yield关键字总是需要IEnumerable作为返回类型?