长度为零时 IEnumerable collection 的默认值

default values for IEnumerable collection when length is zero

我有一个 IEnumerable collection:

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(),
            };        
    }        
}

我面临的问题是,如果这个 return 长度为零,那么我将无法将属性设置为其他内容,如果我有长度为 1 的响应,则属性是从数据库中设置的,但是长度为零,我想为 NameValue.

设置默认值

如果我没有理解错你的问题,你想更换大小写

  • 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"}};
}

检查您的查询是否return任何元素使用任何方法。

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

LINQ 解决方案 - 如果使用 DefaultIfEmpty:

的可枚举项中没有项目,则此 returns 默认值
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"
        });
}

您可以使用 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" });
}