我正在尝试调试从单元测试项目执行的代码,但是当我尝试进入某个方法时,它只是直接进入下一行,并且该方法内的断点未被命中.该方法位于一个不同项目的类中,但所有代码都是在调试模式下构建的,我尝试过清理和重建解决方案,没有任何乐趣.
但是,这只是因为我在方法中添加了一个迭代器块.当我删除它并重建时,我可以介入.奇怪的?
我正在使用Visual Studio 2010 Beta 1,这可能只是一个错误吗?
在C#迭代器块中是否有任何方法可以提供一个代码块,该代码块将在foreach结束时自动运行(或者自然地被打破),比如清理资源?
我提出的最好的方法是使用using构造,这很好,但需要一个IDisposable类来进行清理.例如:
public static IEnumerable<string> ReadLines(this Stream stream)
{
using (StreamReader rdr = new StreamReader(stream))
{
string txt = rdr.ReadLine();
while (txt != null)
{
yield return txt;
txt = rdr.ReadLine();
}
rdr.Close();
}
}
Run Code Online (Sandbox Code Playgroud) 我想更好地了解何时应该而且不应该使用迭代器.对我来说,每当我有大量数据需要迭代时,我都会为它编写一个Iterator.如果它也适合Iterator接口,那么它似乎是一场胜利.
我正在阅读一点,使用Iterator会产生很多开销.
我使用迭代器的一个很好的例子是迭代一堆SQL脚本,一次执行一个查询,读取它,然后执行它.
我应该注意另一种表现权衡吗?在使用迭代器之前,我会读取整个SQL命令字符串以执行到ArrayList中,然后迭代它.如果导入相当大(就像地理位置数据一样,那么服务器往往会陷入困境).
沃尔特
在C#中,使用LINQ,如果我有en枚举enumerable,我可以这样做:
// a: Does the enumerable contain an item that satisfies the lambda?
bool contains = enumerable.Any(lambda);
// b: How many items satisfy the lambda?
int count = enumerable.Count(lambda);
// c: Return an enumerable that contains only distinct elements according to my custom comparer
var distinct = enumerable.Distinct(comparer);
// d: Return the first element that satisfies the lambda, or throws an exception if none
var element = enumerable.First(lambda);
// e: Returns an enumerable containing all the elements except …Run Code Online (Sandbox Code Playgroud) 我有一个带有一些对象组合的模型类,我不知道为此编写迭代器的最佳方法.要更详细地查看问题,这里是层次结构(半伪代码):
Root类:
MYEntity : NSObject
@property int commonProperty;
@property NSArray *childs; //Childs of any kind.
Run Code Online (Sandbox Code Playgroud)
一些具体的子类:
MYConcreteStuff : MYEntity
@property int number;
MYConcreteThing : MYEntity
@property NSString *string;
Run Code Online (Sandbox Code Playgroud)
并且具有具体集合的根对象:
MYRoot : MYEntity
@property MYEntity *stuff; //Collect only stuff childs here.
@property MYEntity *things; //Collect only thing childs here.
Run Code Online (Sandbox Code Playgroud)
现在我可以为集合编写很酷的成员访问器(在MYEntity中),如:
-(MYEntity*)entityForIndex:(int) index
{
if ([self.childs count] > index)
return [self.childs objectAtIndex:index];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
对于根对象,甚至更酷,良好类型的成员成员访问器.
-(MYConcreteThing*)thingForIndex:(int) index
{
if ([self.things count] > index)
return (MYConcreteThing*)[self.things entityForIndex];
return nil;
}
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何为这样的集合编写一些oneliner迭代器.想要的客户端代码如下:
for …Run Code Online (Sandbox Code Playgroud) 要迭代输入流,我们通常会使用std::istream_iterator如下:
typedef std::istream_iterator<std::string> input_iterator;
std::ifstream file("myfile");
for (input_iterator i(file); i != input_iterator(); i++) {
// Here, *i denotes each element extracted from the file
}
Run Code Online (Sandbox Code Playgroud)
如果我们可以使用基于范围的for语句来迭代输入流,那就太好了.但是,对于类的对象,范围为基础的for需要的对象具有begin()和end()成员函数(§6.5.4,粗体强调):
如果
_RangeT是一个数组类型,开始-EXPR和最终EXPR是__range和__range + __bound分别,其中__bound在阵列的约束.如果_RangeT是未知大小的数组或不完整类型的数组,则该程序格式不正确;如果
_RangeT是一个类型时,不合格的IDSbegin并且end在类的范围查找_RangeT仿佛由类成员访问查找(3.4.5),并且如果任一个(或两者)找到至少一个声明,开始-EXPR和端-expr分别是__range.begin()和__range.end();否则,开始-EXPR和最终EXPR是
begin(__range)和end(__range) …
我需要std::list在找到它之后从中删除一个元素std::find.std::list::erase使用end()列表调用的行为是什么?我的情况是这样的:
std::list<T> mylist;
T value;
std::list::iterator it = std::find(mylist.begin(), mylist.end(), value);
std::list::iterator next = mylist.erase(it);
Run Code Online (Sandbox Code Playgroud)
如果position(或range)有效,则函数永远不会抛出异常(无抛出保证).否则,它会导致未定义的行为.
但我不知道的是end()那里是否有效.
在同时处理2个元素的同时迭代列表的最佳方法是什么?
例:
List<String> strings = Arrays.asList("item 1", "item 2", "item 3", "item 4");
for(int i = 0; i < strings.size(); i++){
String first = strings.get(i);
String second = null;
if(strings.size() > i + 1){
second = strings.get(i + 1);
}
System.out.println("First [" + first + "] - Second [" + second + "]");
}
Run Code Online (Sandbox Code Playgroud)
结果是:
First [item 1] - Second [item 2]
First [item 2] - Second [item 3]
First [item 3] - Second [item 4]
First [item 4] - …Run Code Online (Sandbox Code Playgroud) 我有一个Vec<Result<T, E>>,我想忽略所有的Err值,将其转换为Vec<T>.我可以做这个:
vec.into_iter().filter(|e| e.is_ok()).map(|e| e.unwrap()).collect()
Run Code Online (Sandbox Code Playgroud)
这是安全的,但我想避免使用unwrap.有没有更好的方法来写这个?
我正在使用API的几个端点,它返回的数据非常冗长.我想将这些数据的一部分提供给其他地方的另一段代码.
假设我有几个这样的字典(我计划循环并过滤):
asset = {
'id': 1,
'name': 'MY-PC',
'owner': 'me',
'location': 'New York City',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'id': 1,
'name': 'Microsoft'
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个将该字典带入的函数,以及一个"掩码",它将用于创建仅允许的项目的新字典.这可能是一个示例掩码(但是,我可以使用任何格式使得生成的代码最简洁):
mask = {
'id': True,
'name': True,
'model': {
'id': True,
'name': True,
'manufacturer': {
'name': True
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后该函数应该返回:
mask = {
'id': 1,
'name': 'MY-PC',
'model': {
'id': 1,
'name': 'Surface',
'manufacturer': {
'name': 'Microsoft'
}
}
}
Run Code Online (Sandbox Code Playgroud)
Python 3中是否已经内置了有助于此的内容?看起来如果我必须手动执行此操作,它会很快变得非常难看.我发现itertools.compress,但这似乎是列表,不会处理字典的复杂性.
iterator ×10
c# ×2
c++ ×2
java ×2
python ×2
architecture ×1
c++11 ×1
casting ×1
collections ×1
debugging ×1
dictionary ×1
inputstream ×1
ios ×1
objective-c ×1
performance ×1
rust ×1
stl ×1