C# 如何使用yield返回空集合?
我有以下扩展功能:C# 如何使用yield返回空集合?,c#,linq,ienumerable,yield-return,C#,Linq,Ienumerable,Yield Return,我有以下扩展功能: public static IEnumerable<T> Select<T>(this IDataReader reader, Func<IDataReader, T> selector) { while (reader.Read()) { yield return selector(reader); } } public static
public static IEnumerable<T> Select<T>(this IDataReader reader,
Func<IDataReader, T> selector)
{
while (reader.Read())
{
yield return selector(reader);
}
}
public static IEnumerable Select(此IDataReader读取器,
Func选择器)
{
while(reader.Read())
{
收益率返回选择器(读卡器);
}
}
其使用方式如下:
var readFields = dsReader.Select(r =>
{
var serviceResponse = myService.Decrypt<DateTime>(r.GetString(DATE_VALUE), r.GetInt32(DEK_ID));
if (serviceResponse.IsSuccessful)
{
return new DataField<DateFieldValue>
{
FieldValue = new DateFieldValue { Data = serviceResponse.Value }
};
}
return null;
});
if (!readFields.IsCollectionNullOrEmpty())
returnFinalFields.AddRange(readFields);
var readFields=dsReader.Select(r=>
{
var servicesponse=myService.Decrypt(r.GetString(日期值),r.GetInt32(DEK_ID));
if(serviceResponse.IsSuccessful)
{
返回新数据字段
{
FieldValue=new DateFieldValue{Data=serviceResponse.Value}
};
}
返回null;
});
如果(!readFields.IsCollectionNullOrEmpty())
returnFinalFields.AddRange(readFields);
我在这里面临的问题是,即使serviceResponse.IsSuccessful为false,readFields也不是空的,它包含一个带有null项的可枚举项。有什么方法可以在这里返回空集合吗?选择方法可以检查返回的结果,并且只在有效时生成其值。例如,非
null
:
public static IEnumerable<T> Select<T>(this IDataReader reader, Func<IDataReader, T> selector)
where T:class
{
while (reader.Read())
{
var res = selector(reader);
if(res!=null)
yield return res;
}
}
public static IEnumerable Select(此IDataReader读取器,Func选择器)
T:在哪里上课
{
while(reader.Read())
{
var res=选择器(读卡器);
如果(res!=null)
收益率;
}
}
尽管如Servy所述,这通常不属于常规的Select
。可以调用类似于SelectValidValues
的方法,以避免混淆
另一种方法是让lambda参数返回一个元组,该元组包含结果和是否有效。
另一种方法是使用可选参数(作为值或额外的谓词函数)来检查哪些值是有效的
Select
方法可以检查返回的结果,并且只在有效时生成其值。例如,非null
:
public static IEnumerable<T> Select<T>(this IDataReader reader, Func<IDataReader, T> selector)
where T:class
{
while (reader.Read())
{
var res = selector(reader);
if(res!=null)
yield return res;
}
}
public static IEnumerable Select(此IDataReader读取器,Func选择器)
T:在哪里上课
{
while(reader.Read())
{
var res=选择器(读卡器);
如果(res!=null)
收益率;
}
}
尽管如Servy所述,这通常不属于常规的Select
。可以调用类似于SelectValidValues
的方法,以避免混淆
另一种方法是让lambda参数返回一个元组,该元组包含结果和是否有效。
另一种方法是使用可选参数(作为值或额外的谓词函数)检查哪些值有效这里真正的问题是,当服务没有成功响应时,您不希望选择一个
null
值。作为查询的一部分,您需要筛选出成功的响应:
var readFields = from r in dsReader
let serviceResponse = myService.Decrypt<DateTime>(r.GetString(DATE_VALUE), r.GetInt32(DEK_ID))
where serviceResponse.IsSuccessful
select new DataField<DateFieldValue>
{
FieldValue = new DateFieldValue { Data = serviceResponse.Value }
};
var readFields=来自dsReader中的r
让serviceResponse=myService.Decrypt(r.GetString(DATE\u值),r.GetInt32(DEK\u ID))
其中serviceResponse.IsSuccessful
选择新数据字段
{
FieldValue=new DateFieldValue{Data=serviceResponse.Value}
};
这里真正的问题是,当服务没有成功响应时,您不希望选择一个null
值。作为查询的一部分,您需要筛选出成功的响应:
var readFields = from r in dsReader
let serviceResponse = myService.Decrypt<DateTime>(r.GetString(DATE_VALUE), r.GetInt32(DEK_ID))
where serviceResponse.IsSuccessful
select new DataField<DateFieldValue>
{
FieldValue = new DateFieldValue { Data = serviceResponse.Value }
};
var readFields=来自dsReader中的r
让serviceResponse=myService.Decrypt(r.GetString(DATE\u值),r.GetInt32(DEK\u ID))
其中serviceResponse.IsSuccessful
选择新数据字段
{
FieldValue=new DateFieldValue{Data=serviceResponse.Value}
};
有趣(mis?)使用选择。问题是当issucessful
为false
时,您从Select
委托返回空值。由于不从Select
的委托返回值不是一个选项,因此随后进行筛选:
var readFields = dsReader.Select(r => {
var serviceResponse = myService.Decrypt<DateTime>(r.GetString(DATE_VALUE), r.GetInt32(DEK_ID));
if (serviceResponse.IsSuccessful)
return new DataField<DateFieldValue> {
FieldValue = new DateFieldValue { Data = serviceResponse.Value }
};
else
return null;
}).Where(df => df != null);
var readFields=dsReader.Select(r=>{
var servicesponse=myService.Decrypt(r.GetString(日期值),r.GetInt32(DEK_ID));
if(serviceResponse.IsSuccessful)
返回新数据字段{
FieldValue=new DateFieldValue{Data=serviceResponse.Value}
};
其他的
返回null;
})。其中(df=>df!=null);
有趣(mis?)使用选择。问题是当issucessful
为false
时,您从Select
委托返回空值。由于不从Select
的委托返回值不是一个选项,因此随后进行筛选:
var readFields = dsReader.Select(r => {
var serviceResponse = myService.Decrypt<DateTime>(r.GetString(DATE_VALUE), r.GetInt32(DEK_ID));
if (serviceResponse.IsSuccessful)
return new DataField<DateFieldValue> {
FieldValue = new DateFieldValue { Data = serviceResponse.Value }
};
else
return null;
}).Where(df => df != null);
var readFields=dsReader.Select(r=>{
var servicesponse=myService.Decrypt(r.GetString(日期值),r.GetInt32(DEK_ID));
if(serviceResponse.IsSuccessful)
返回新数据字段{
FieldValue=new DateFieldValue{Data=serviceResponse.Value}
};
其他的
返回null;
})。其中(df=>df!=null);
可枚举的.Empty()
是否有一种方法可以在读卡器之前检查。Read()以查看是否有数据,并在进入while之前返回null?@Neil从预期的IEnumerable
返回null几乎总是一种反模式。您可以添加其中(x=>x!=null)
?@Neil或任何其他线程,包括SO问题。关键是,通过潜在地返回null,您将被迫执行额外的检查…首先检查null,然后检查项目是否存在。返回空集合而不是null允许您始终直接访问集合,而无需担心NullReferenceExceptions。Enumerable.empty()
是否有一种方法可以在读卡器之前检查。Read()以查看是否有数据,并在进入while之前返回null?@Neil从预期的IEnumerable
返回null几乎总是一种反模式。您可以添加其中(x=>x!=null)
?@Neil或任何其他线程,包括SO问题。关键是