我有一个简单的linq查询:
var k = people.Select(x=>new{x.ID, x.Name});
Run Code Online (Sandbox Code Playgroud)
然后我想要一个函数或linq lambda,或者使用逗号和"ands"以句子格式输出名称的东西.
{1, John}
{2, Mark}
{3, George}
Run Code Online (Sandbox Code Playgroud)
至
"1:John, 2:Mark and 3:George"
Run Code Online (Sandbox Code Playgroud)
我很好用硬编码ID + ":" + Name部件,但它可能是一个ToString(),具体取决于linq查询结果的类型.我只是想知道是否有一个简洁的方法来使用linq或String.Format().
为何选择Linq?
StringBuilder sb = new StringBuilder();
for(int i=0;i<k.Count();i++)
{
sb.Append(String.Format("{0}:{1}", k[i].ID, k[i].Name);
if(i + 2 < k.Count())
sb.Append(", ");
else if(i + 1 < k.Count())
sb.Append(" and ");
}
Run Code Online (Sandbox Code Playgroud)
真的,所有Linq都会让你做的就是隐藏循环.
另外,确保你想要或不想要" 牛津逗号 "; 这个算法不会插入一个,但会有一个小的改动(在除了最后一个之外的每个元素之后附加逗号和空格,并且在倒数第二个之后追加"和").
public string ToPrettyCommas<T>(
List<T> source,
Func<T, string> stringSelector
)
{
int count = source.Count;
Func<int, string> prefixSelector = x =>
x == 0 ? "" :
x == count - 1 ? " and " :
", ";
StringBuilder sb = new StringBuilder();
for(int i = 0; i < count; i++)
{
sb.Append(prefixSelector(i));
sb.Append(stringSelector(source[i]));
}
string result = sb.ToString();
return result;
}
Run Code Online (Sandbox Code Playgroud)
叫:
string result = ToPrettyCommas(people, p => p.ID.ToString() + ":" + p.Name);
Run Code Online (Sandbox Code Playgroud)