C# 中 LINQ 中的空集

Empty set in LINQ in C#

    public static string ToHtml(List<int> tags)
    {
        var found = Values.Where(v => tags.Contains(v.Key));

        if (found.Any())
            return found.Select(v => v.Value.ToHtml()).Aggregate((v1, v2) => v1 + v2) + " ";
        else
            return String.Empty;
    }

代码首先从字典中找到一组满足条件的对。然后,如果该集合有任何元素,则每对都将转换为 html 并聚合结果字符串(类似于 String.Join("", ...))。但是,如果没有找到对,return String.Empty.

我的问题是:如何做到简单、巧妙、清晰,又不用写那么多?

我想到了这个:

    public static string ToHtml(List<int> tags)
    {
        return Values
            .Select(v => tags.Contains(v.Key) ? v.Value.ToHtml() : null)
            .Aggregate((v1, v2) => v1 + v2);
    }

但不幸的是,我现在无法在字符串后添加“”(space),以防集合不为空。如果集合为空我要returnString.Empty,否则字符串+"".

忘记了 ToHtml 方法,您可以使用 space 分隔符进行聚合,然后删除尾随 spaces:

const char space = ' ';
var s = values
            .Select(v => tags.Contains(v.Key) ? v.Value : String.Empty)
            .Aggregate((v1, v2) => v1 + space + v2)
            .TrimEnd(space);

rextester sample here,测试 empty/not 空交集。

"Simple and clear" 并不总是 "minimalistic" 的同义词。您不应该尝试使用 .Select() 进行投影和过滤。过滤是 .Where() 的作用。所以首先select你需要的物品,然后相应地行动。

在较新版本的 .NET (4.0+) 中,您可以只使用 string.Join():

public static string ToHtml(List<int> tags)
{
    var found = Values.Where(v => tags.Contains(v.Key))
                      .Select(v => v.Value.ToHtml());

    return found.Any()
        ? string.Join("", found) + " "
        : string.Empty;
}

在旧版本的 .NET 中,您几乎可以执行相同的操作,但您需要 .ToArray():

public static string ToHtml(List<int> tags)
{
    var found = Values.Where(v => tags.Contains(v.Key))
                      .Select(v => v.Value.ToHtml());

    return found.Any()
        ? string.Join("", found.ToArray()) + " "
        : string.Empty;
}