LINQ列表到句子格式(插入逗号&"和")

Har*_*rry 6 c# linq string

我有一个简单的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().

Kei*_*thS 6

为何选择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都会让你做的就是隐藏循环.

另外,确保你想要或不想要" 牛津逗号 "; 这个算法不会插入一个,但会有一个小的改动(在除了最后一个之外的每个元素之后附加逗号和空格,并且在倒数第二个之后追加"和").

  • @Timwi:你更喜欢O(n²)?奇. (3认同)

Amy*_*y B 6

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)