当length为零时,IEnumerable集合的默认值

时间:2015-05-15 11:02:18

标签: c# asp.net wcf

我有一个IEnumerable集合:

public IEnumerable<Config> getConfig(string CID, string name)
{
    var raw = db.ap_GetInfo(CID, name);
    foreach (var item in raw.ToList().Where(x => x.Name!= null))                       
    {
        var x = raw.Count();    
        yield return new Config
            {
                Name = item.Name.ToString(),                        
                Value = item.Value.ToString(),
            };        
    }        
}

我面临的问题是,如果返回的长度为零,那么我就无法将属性设置为其他内容,如果我有一个长度为1的响应,则从数据库设置属性,但是我想要的长度为零为NameValue设置默认值。

4 个答案:

答案 0 :(得分:3)

LINQ解决方案 - 如果使用DefaultIfEmpty在枚举项中没有项目,则返回默认值:

public IEnumerable<Config> GetConfig(string CID, string name)
{
    return db.ap_GetInfo(CID, name)
        .Where(x => !string.IsNullOrEmpty(x.Name))
        .Select(x => new Config
        {
            Name = x.Name.ToString(),
            Value = x.Value.ToString(),
        })
        .DefaultIfEmpty(new Config
        {
            Name = "DefaultName",
            Value = "DefaultValue"
        });
}

答案 1 :(得分:1)

如果我理解你的问题,你想要替换案例

  • 0结果

  • 1个带有默认值的结果。

如果这是正确的,最简单的方法是在调用函数中解决此问题:

var result = getConfig(...).ToList();
if (!result.Any())
{
    result = new[] {new Config {Name = "DefaultName", Value = "DefaultValue"}};
}

显然,你可以将它包装在一个新函数中:

public IEnumerable<ClubConfig> getConfigOrDefault(string CID, string name)
{
    var result = getConfig(CID, name).ToList();
    if (result.Any())
        return result;
    else
        return new[] {new Config {Name = "DefaultName", Value = "DefaultValue"}};
}

答案 2 :(得分:0)

要检查您的查询是否确实返回任何元素,请使用Any-method。

public IEnumerable<ClubConfig> getConfig(string CID, string name)
{
    var raw = db.ap_GetInfo(CID, name);
    if (!raw.Any()) return new[] {
            ClubConfig 
            {
                Name = "defaultName", 
                Value = "defaultValue" 
            }};

    foreach (var item in raw.Where(x => !string.IsNullOrEmpty(x.Name))                       
    {

        yield return new ClubConfig
        {
            Name = item.Name.ToString(),                        
            Value = item.Value.ToString(),
        };        
    }        
}

编辑:您也可以省略输入中的ToList

答案 3 :(得分:0)

您可以使用LINQ执行此操作,并可以按如下方式对IEnumerable结果进行延迟评估:

public IEnumerable<ClubConfig> getConfig(string CID, string name) 
{
    var raw = db.ap_GetInfo(CID, name);
    return raw.Where(x => !string.IsNullOrEmpty(x.Name))
       .Select(item => new ClubConfig
        {
            Name = item.Name.ToString(),                        
            Value = item.Value.ToString(),
        })
       .DefaultIfEmpty(new ClubConfig { Name = "n", Value="v" });
}