도대체 '에서 문자열 값을 깨끗한 만들 수 있는 방법이 쉼표로 IList< string>' 또는 ',' IEnumerable< string>?;;;
'스테링스타인 (.)' 에서 '문자열 []' 는 등의 번거로운 때 사용할 수 있어, '또는', ',' IList< 추상형데이터타입 string> IEnumerable<, string> 변환될지 문자열으로 어레이입니다 쉽지 않습니다.
.NET 4+
IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);
, ',' 가 IEnumerable< string> 변환될지 문자열으로 어레이입니다 매우 쉽게 LINQ (.NET 3.5):
IEnumerable<string> strings = ...;
string[] array = strings.ToArray();
public static T[] ToArray(IEnumerable<T> source)
{
return new List<T>(source).ToArray();
}
그럼 부르네요 다음과 같습니다.
IEnumerable<string> strings = ...;
string[] array = Helpers.ToArray(strings);
그런 다음 스테링스타인 '콜'. 물론, 보조 t # 39 너회가 don& 사용할 수 있는 방법:
// C# 3 and .NET 3.5 way:
string joined = string.Join(",", strings.ToArray());
// C# 2 and .NET 2.0 way:
string joined = string.Join(",", new List<string>(strings).ToArray());
후자는 한 한 모금 마실래 조금 표시되어도:)
이 될 가능성이 가장 간단한 방법은 강력한 아니라 - 이외에도 그것을하지 상실과 같은 문제에 대해 정확히 성능은 비롯한 국한되지) 이 번호요.
Net 4.0 에서 사용할 수 있는 과부하를 vmware. 더 많습니다 '스테링스타인', 실제로 쓸 수 있도록 그냥.
string joined = string.Join(",", strings);
훨씬 더 단순한:)
FYI, 닷넷 (.net) 기반 4.0 버전의 '스테링스타인 ()' 는 일부 추가 과부하를 ',' 리누머이블 사용할 수 있는 게 아니라 어레이에는 통해 해결할 수 있는 1 개 포함 모든 형태의 'T':
public static string Join(string separator, IEnumerable<string> values)
public static string Join<T>(string separator, IEnumerable<T> values)
내 생각에 쉼표로 구체화하십시오 값은 깨끗한 만들 수 있는 방법이 됩니다.
string.Join<string>(",", stringEnumerable);
이것은 전체 예:
IEnumerable<string> stringEnumerable= new List<string>();
stringList.Add("Comma");
stringList.Add("Separated");
string.Join<string>(",", stringEnumerable);
보조 기능을 할 수 없다, 이는 내장되었을 .NET 4.0 이상.
비교, 정보기술 (it), sb 는 정도에 따라 승패가 " 루프. 정보기술 (it), 덮어쓰기/추가 뒤로를 실행하십시오 step". 실제로 " 열거 및 수동 움직이십시오 next"; 좋은 (고려해보십시오 스테데프) 도 마찬가지다.
BenchmarkDotNet=v0.10.5, OS=Windows 10.0.14393
Processor=Intel Core i5-2500K CPU 3.30GHz (Sandy Bridge), ProcessorCount=4
Frequency=3233539 Hz, Resolution=309.2587 ns, Timer=TSC
[Host] : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Clr : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1637.0
Core : .NET Core 4.6.25009.03, 64bit RyuJIT
Method | Job | Runtime | Mean | Error | StdDev | Min | Max | Median | Rank | Gen 0 | Allocated |
---------------------- |----- |-------- |---------:|----------:|----------:|---------:|---------:|---------:|-----:|-------:|----------:|
StringJoin | Clr | Clr | 28.24 us | 0.4381 us | 0.3659 us | 27.68 us | 29.10 us | 28.21 us | 8 | 4.9969 | 16.3 kB |
SeparatorSubstitution | Clr | Clr | 17.90 us | 0.2900 us | 0.2712 us | 17.55 us | 18.37 us | 17.80 us | 6 | 4.9296 | 16.27 kB |
SeparatorStepBack | Clr | Clr | 16.81 us | 0.1289 us | 0.1206 us | 16.64 us | 17.05 us | 16.81 us | 2 | 4.9459 | 16.27 kB |
Enumerable | Clr | Clr | 17.27 us | 0.0736 us | 0.0615 us | 17.17 us | 17.36 us | 17.29 us | 4 | 4.9377 | 16.27 kB |
StringJoin | Core | Core | 27.51 us | 0.5340 us | 0.4995 us | 26.80 us | 28.25 us | 27.51 us | 7 | 5.0296 | 16.26 kB |
SeparatorSubstitution | Core | Core | 17.37 us | 0.1664 us | 0.1557 us | 17.15 us | 17.68 us | 17.39 us | 5 | 4.9622 | 16.22 kB |
SeparatorStepBack | Core | Core | 15.65 us | 0.1545 us | 0.1290 us | 15.45 us | 15.82 us | 15.66 us | 1 | 4.9622 | 16.22 kB |
Enumerable | Core | Core | 17.00 us | 0.0905 us | 0.0654 us | 16.93 us | 17.12 us | 16.98 us | 3 | 4.9622 | 16.22 kB |
코드:
public class BenchmarkStringUnion
{
List<string> testData = new List<string>();
public BenchmarkStringUnion()
{
for(int i=0;i<1000;i++)
{
testData.Add(i.ToString());
}
}
[Benchmark]
public string StringJoin()
{
var text = string.Join<string>(",", testData);
return text;
}
[Benchmark]
public string SeparatorSubstitution()
{
var sb = new StringBuilder();
var separator = String.Empty;
foreach (var value in testData)
{
sb.Append(separator).Append(value);
separator = ",";
}
return sb.ToString();
}
[Benchmark]
public string SeparatorStepBack()
{
var sb = new StringBuilder();
foreach (var item in testData)
sb.Append(item).Append(',');
if (sb.Length>=1)
sb.Length--;
return sb.ToString();
}
[Benchmark]
public string Enumerable()
{
var sb = new StringBuilder();
var e = testData.GetEnumerator();
bool moveNext = e.MoveNext();
while (moveNext)
{
sb.Append(e.Current);
moveNext = e.MoveNext();
if (moveNext)
sb.Append(",");
}
return sb.ToString();
}
}
하지만 이건 좀 많이 늦게 도착한 이 토론에 대한 내 기여 파비우. 내가 가지고 있는 'IList< Guid>; 그 다음은 변환하지는 CSV 문자열이어야 로드리즈 '를 통해 일반 및 작동됨 수정되지 않은 다른 유형:
string csv = OrderIds.Aggregate(new StringBuilder(),
(sb, v) => sb.Append(v).Append(","),
sb => {if (0 < sb.Length) sb.Length--; return sb.ToString();});
파선-짧은 달콤하고, 문자열, 길이 1 씩 줄어들고 스트라이베이더 /dev/raw/raw1 구성에 대한 새로운 스트라이베이더 지루려면 되돌려줍니다 마지막 쉼표, CSV 구체화하십시오.
I& # 39, & # 39 이 여러 번 () ',' s 를 사용하려면 업데이트되도록 덮어쓰기/추가 추가 구체화하십시오 + 쉼표. # 39 에서 James&. 내가 봐도 Reflector 피드백을 할 때 '스트라이버일드리아펜드포르마 ()'. 알고보니 ' ()' 는 크게 덜 수 있는 스트라이베이더 아펜드포르마 chunghwa 형식 문자열 () 이 아닌 '& # 39 첨부됩니다 효율적인 컨텍스트로 사용하여, 여러' s.
하지만 뭔가 좀 못생기고 작동하잖아:
string divisionsCSV = String.Join(",", ((List<IDivisionView>)divisions).ConvertAll<string>(d => d.DivisionID.ToString("b")).ToArray());
Csv 를 사용하면 List< T>; 이 변환기를 열거하십시오 후에는 (이 경우 d = >. d. 디비시온드스토스트링 (b" ";)).
그러나 만들어질 수 있는 방법을 확장명으로 해키 작동됨 - 아마도?
private string ToStringList<T>(IEnumerable<T> list, string delimiter)
{
var sb = new StringBuilder();
string separator = String.Empty;
foreach (T value in list)
{
sb.Append(separator).Append(value);
separator = delimiter;
}
return sb.ToString();
}
우리는 효용 함수, 이 같은 일이.
public static string Join<T>( string delimiter,
IEnumerable<T> collection, Func<T, string> convert )
{
return string.Join( delimiter,
collection.Select( convert ).ToArray() );
}
쉽게 사용할 수 있는 많은 컬렉션 참가.
int[] ids = {1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233};
string csv = StringUtility.Join(",", ids, i => i.ToString() );
참고로 우리가 인텔리 매개변수 때문에 그 전에 취합은 람다 벨이 up the 취합은 유형:.
All you need to do 는 토라리 문장열 열거도 경우 이미 완성되어 있다.
string csv = string.Join( ",", myStrings.ToArray() );
그러나 위와 같은 무거운 내 답이 없기 때문에 전체 솔루션이므로 명시성 위임합니다 페이징됩니다 콜 스택 낮아야 합니다.
public static string ToCommaDelimitedString<T>(this IEnumerable<T> items)
{
StringBuilder sb = new StringBuilder();
foreach (var item in items)
{
sb.Append(item.ToString());
sb.Append(',');
}
if (sb.Length >= 1) sb.Length--;
return sb.ToString();
}
물론 서명입니다 비종속 구분 한 수 더 연장할 수 있다. # 39 m 의 팬, 진짜 안 i& sb. 제거 (), d like to call 을 통해 it to be a # 39 I& 리팩터링 while 루프 리누머이블 모베네스트 스트레이트 업 () 및 사용 여부를 결정하는 데 쓸 쉼표. # 39, 만약 내가 있는 it 관련 솔루션을 희들에게 게시물로의 i& ll 해야했다.
public static string ToDelimitedString<T>(this IEnumerable<T> source, string delimiter, Func<T, string> converter)
{
StringBuilder sb = new StringBuilder();
var en = source.GetEnumerator();
bool notdone = en.MoveNext();
while (notdone)
{
sb.Append(converter(en.Current));
notdone = en.MoveNext();
if (notdone) sb.Append(delimiter);
}
return sb.ToString();
}
스토리지 필요 없는 임시 어레이나 목록 () '또는' no '및' '분리하십시오 스트라이베이더 길이' 해킹 필요합니다.
I made in my 레임워크 라이브러리란 차이가 적은 모든 조합을 '구분' 와 '등 이 방법을 서명입니다 변환기', ',' 와 '의 사용, " 매개변수입니다 " 설정값으로 스스토스트링 ()' 으로 소폭 하락했다.
이것은 가장 간단한 방법은 있기를 바랍니다
string Commaseplist;
string[] itemList = { "Test1", "Test2", "Test3" };
Commaseplist = string.join(",",itemList);
Console.WriteLine(Commaseplist); //Outputs Test1,Test2,Test3
방금 전에 이 문제를 해결할 일이 구현하므로 이 글. 내 솔루션이므로 댁이라면 같은 항목을 참조).
private static string GetSeparator<T>(IList<T> list, T item)
{
return (list.IndexOf(item) == list.Count - 1) ? "" : ", ";
}
호출됨 다음과 같습니다.
List<thing> myThings;
string tidyString;
foreach (var thing in myThings)
{
tidyString += string.format("Thing {0} is a {1}", thing.id, thing.name) + GetSeparator(myThings, thing);
}
난 것처럼 쉽게 표현할 수 있을 수도 있고 또한 많이 등 보다 효율적인:
string.Join(“,”, myThings.Select(t => string.format(“Thing {0} is a {1}”, t.id, t.name));
C # 이 토론을 통해 왔는지 검색할 때 좋은 방법을 통해 정보기술 (it) 등 완료되어도 참가하십시오 문장열 mysql 메서드입니다 'CONCAT_WS ()'. 이 방법은 다른 방법으로 분리자의 추가할 수 없는 경우 () '' 스테링스타인 예중이 문장열 null 이거나 비어 있습니다.
>. CONCAT_WS (& # 39, & # 39, 트블랫퍼스트나미 트블랫라스트나미;;)
반면, '성' 만 있으면 반환되므로 firstname 비워집니다
>. 구체화하십시오. Join (,,, " " 스트라스트나미 스트라퍼스트나미)
',' 같은 경우, " 반환되므로 스트라스트나미 + ".
왠지 내가 첫 번째 비헤이비어를 다음과 같은 방법을 썼다.
public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string strA, string strB, string strC = "")
{
return JoinStringsIfNotNullOrEmpty(strSeparator, new[] {strA, strB, strC});
}
public static string JoinStringsIfNotNullOrEmpty(string strSeparator, string[] arrayStrings)
{
if (strSeparator == null)
strSeparator = "";
if (arrayStrings == null)
return "";
string strRetVal = arrayStrings.Where(str => !string.IsNullOrEmpty(str)).Aggregate("", (current, str) => current + (str + strSeparator));
int trimEndStartIndex = strRetVal.Length - strSeparator.Length;
if (trimEndStartIndex>0)
strRetVal = strRetVal.Remove(trimEndStartIndex);
return strRetVal;
}
뭔가 사용할 수도 있습니다) 로 중 하나를 사용하여 다음과 같은 방법을 통해 나열되는지 어레이에서는 할꺼이나 후에는 기타:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Net;
using System.Configuration;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
CommaDelimitedStringCollection commaStr = new CommaDelimitedStringCollection();
string[] itemList = { "Test1", "Test2", "Test3" };
commaStr.AddRange(itemList);
Console.WriteLine(commaStr.ToString()); //Outputs Test1,Test2,Test3
Console.ReadLine();
}
}
}
내가 작성했습니까 확장명은 that& # 39 의 효율적인 방식으로 이를 위한 몇 가지 방법:
public static string JoinWithDelimiter(this IEnumerable<String> that, string delim) {
var sb = new StringBuilder();
foreach (var s in that) {
sb.AppendToList(s,delim);
}
return sb.ToString();
}
이 따라 달라집니다.
public static string AppendToList(this String s, string item, string delim) {
if (s.Length == 0) {
return item;
}
return s+delim+item;
}