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