IList 또는 IENumerable 에서 쉼표로 구분된 목록 생성
값 방법은 입니까?IList<string>
★★★★★★★★★★★★★★★★★」IEnumerable<string>
String.Join(...)
기반으로 동작합니다.string[]
가 있을 수 .IList<string>
★★★★★★★★★★★★★★★★★」IEnumerable<string>
을 사용하다
.NET 4 이상
IList<string> strings = new List<string>{"1","2","testing"};
string joined = string.Join(",", strings);
상세 & 프리넷 4.0 솔루션
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);
다음 '아까보다'로 전화를 됩니다.string.Join
물론 도우미 방법을 사용할 필요는 없습니다.
// 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 에서는 보다 많은 오버로드를 사용할 수 있기 때문에 실제로는 다음과 같이 쓸 수 있습니다.
string joined = string.Join(",", strings);
훨씬 심플하게 :)
: NET 4.0 버전string.Join()
과중한 작업 부하를 가지고 있습니다.IEnumerable
뿐만 아니라 할 수 도 됩니다.T
:
public static string Join(string separator, IEnumerable<string> values)
public static string Join<T>(string separator, IEnumerable<T> values)
입니다.Aggregate
★★★★
string commaSeparatedList = input.Aggregate((a, x) => a + ", " + x)
문자열 값의 쉼표로 구분된 목록을 작성하는 가장 깔끔한 방법은 다음과 같습니다.
string.Join<string>(",", stringEnumerable);
다음으로 완전한 예를 제시하겠습니다.
IEnumerable<string> stringEnumerable= new List<string>();
stringList.Add("Comma");
stringList.Add("Separated");
string.Join<string>(",", stringEnumerable);
도우미 기능을 만들 필요가 없습니다.이것은 에 포함되어 있습니다.NET 4.0 이후
가입할 문자열이 [List of Objects]에 있는 경우 다음과 같은 작업을 수행할 수도 있습니다.
var studentNames = string.Join(", ", students.Select(x => x.name));
퍼포먼스를 비교해보면 우승자는 "Loop it, sb"입니다.붙이고 백스텝 해"실제로 "다음으로 열거 가능 및 수동 이동"은 동일합니다(stdev 고려).
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();
}
}
https://github.com/dotnet/BenchmarkDotNet 가 사용되었습니다.
오브젝트 리스트의 특정 속성(ToString()이 아닌)에 참가하기 위해 검색 중에 여기에 도달했기 때문에, 여기에 받아들여진 답변이 추가되어 있습니다.
var commaDelimited = string.Join(",", students.Where(i => i.Category == studentCategory)
.Select(i => i.FirstName));
다른 확장 방법은 다음과 같습니다.
public static string Join(this IEnumerable<string> source, string separator)
{
return string.Join(separator, source);
}
이 토론에 조금 늦게 도착했지만 이것이 나의 기여입니다.는 i i나 an an an i i i i i i i 。IList<Guid> OrderIds
CSV 문자열로 변환되지만 다음 항목은 범용이며 다른 유형에서 변경되지 않고 작동합니다.
string csv = OrderIds.Aggregate(new StringBuilder(),
(sb, v) => sb.Append(v).Append(","),
sb => {if (0 < sb.Length) sb.Length--; return sb.ToString();});
짧고 스위트하며 String Builder를 사용하여 새 문자열을 만들고 String Builder 길이를 1개 축소하여 마지막 콤마를 삭제하고 CSV 문자열을 반환합니다.
번 Append()
문자열 + 콤마를 추가합니다.하여 James의 리플렉터를 보았습니다.StringBuilder.AppendFormat()
★★★★★★★★★★★★★★★.AppendFormat()
Builder를 하기 위해 String Builder를 보다 이 .Appends()
의 discriptions
좀 허황된 일이지만, 효과가 있다.
string divisionsCSV = String.Join(",", ((List<IDivisionView>)divisions).ConvertAll<string>(d => d.DivisionID.ToString("b")).ToArray());
컨버터를 지정한 후 목록에서 CSV를 제공합니다(이 경우 d = > d).나누기ID.ToString("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();
}
'로 둘러싸야 하는 구체적인 요구:
string[] arr = { "jj", "laa", "123" };
List<string> myList = arr.ToList();
// 'jj', 'laa', '123'
Console.WriteLine(string.Join(", ",
myList.ConvertAll(m =>
string.Format("'{0}'", m)).ToArray()));
다음과 같은 유틸리티 기능이 있습니다.
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() );
그러면 인텔리센스가 수집 유형을 선택하기 때문에 람다 앞에 수집 매개 변수가 있다는 점에 유의하십시오.
문자열 열거가 이미 있는 경우 ToArray만 수행하면 됩니다.
string csv = string.Join( ",", myStrings.ToArray() );
ToArray를 사용하여 IList를 어레이로 변환한 다음 문자열을 실행할 수 있습니다.어레이에서 join 명령어를 사용합니다.
Dim strs As New List(Of String)
Dim arr As Array
arr = strs.ToArray
의 Linq 확장을 사용하여 쉽게 배열로 변환할 수 있습니다.NET 3.5
var stringArray = stringList.ToArray();
다른 사용자가 나열한 방법 중 하나를 사용하여 배열로 변환한 후 다음과 같은 방법을 사용할 수도 있습니다.
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();
}
}
}
편집: 다음은 다른 예입니다.
나는 이 기사를 읽기 전에 이 문제를 해결했다.이 솔루션은 다음과 같습니다.
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));
이 답변은 Aggregate 솔루션과 동일하지만 명시적인 위임 콜이 없기 때문에 콜 스택의 부하를 줄일 수 있습니다.
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();
}
물론 서명은 딜리미터에 의존하지 않고 확장할 수 있습니다.나는 정말로 누군가의 팬이 아니다.remove() 호출을 하면 IEnumerable을 통한 스트레이트업 while-loop으로 리팩터링하고 MoveNext()를 사용하여 콤마를 쓸지 여부를 결정합니다.나는 빈둥거리다가 그 해결책을 발견하면 게시할 것이다.
처음에 제가 원했던 것은 다음과 같습니다.
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();
}
하지 않으며 스토리지는 필요하지 않습니다.StringBuilder
Remove()
★★★★★★★★★★★★★★★★★」Length--
해킹이 필요합니다.
에서 이 시그니처를 몇 했습니다.각 조합에는 「이러한 시그니처가 되어 있습니다.★★★★★★★★★★★★★★★★,delimiter
및 그converter
사용 파라미터","
그리고.x.ToString()
디폴트로 설정합니다.
이게 가장 간단한 방법이었으면 좋겠어
string Commaseplist;
string[] itemList = { "Test1", "Test2", "Test3" };
Commaseplist = string.join(",",itemList);
Console.WriteLine(Commaseplist); //Outputs Test1,Test2,Test3
MySql 메서드처럼 문자열을 결합하기 위한 좋은 C# 메서드를 찾다가 이 토론을 하게 되었습니다.CONCAT_WS()
이 방법은 다음 명령어와 다릅니다.string.Join()
문자열이 NULL이거나 비어 있는 경우 구분 기호를 추가하지 않는 메서드입니다.
CONCAT_WS( , , ' , tbl ).성, TBL.이름)
반환만 가능Lastname
이름이 비어 있는 경우
string.Join(), ", strLastname, strFirstname)
돌아온다strLastname + ", "
같은 경우에.
첫 번째 행동을 원해서 다음과 같은 방법을 썼습니다.
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;
}
효율적인 방법으로 몇 가지 확장 방법을 작성했습니다.
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;
}
사용할 수 있습니다..ToArray()
에Lists
그리고.IEnumerables
를 사용하여String.Join()
당신이 원하던 대로.
쉼표로 구분된 목록을 작성하려면IList<string>
또는IEnumerable<string>
사용하는 것 외에string.Join()
를 사용할 수 있습니다.StringBuilder.AppendJoin
방법:
new StringBuilder().AppendJoin(", ", itemList).ToString();
또는
$"{new StringBuilder().AppendJoin(", ", itemList)}";
이 질문에 답하기엔 조금 늦은 건 알지만, 이 문제에 대한 답을 찾는 사람이 도움이 될 수도 있습니다.
다음과 같은 작업을 수행할 수 있습니다.
var finalString = String.Join(",", ExampleArrayOfObjects.Where(newList => !String.IsNullOrEmpty(newList.TestParameter)).Select(newList => newList.TestParameter));
ExampleArrayOfObjects 사용.값이 비어 있지 않은 새 개체 목록을 만듭니다.
그 후 를 사용합니다.새 오브젝트 목록 위에 " "를 구분자로 결합하고 마지막 문자열을 만듭니다.
언급URL : https://stackoverflow.com/questions/799446/creating-a-comma-separated-list-from-iliststring-or-ienumerablestring
'programing' 카테고리의 다른 글
SQL Server 2005에서 전화번호를 저장하기 위해 사용하는 데이터 유형은 무엇입니까? (0) | 2023.04.10 |
---|---|
Gem 설치 오류:먼저 개발 도구를 설치해야 합니다(Windows). (0) | 2023.04.10 |
iOS 앱, 프로그래밍 방식으로 빌드 버전 가져오기 (0) | 2023.04.10 |
새로운 기준 자동 계수 메커니즘은 어떻게 작동합니까? (0) | 2023.04.10 |
실행 시 값으로 strings.xml에 플레이스 홀더를 지정할 수 있습니까? (0) | 2023.04.10 |