Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用yield返回空集合?_C#_Linq_Ienumerable_Yield Return - Fatal编程技术网

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问题。关键是