MatchCollection을 string 형 배열로 변환
MatchCollection을 문자열 배열로 변환하는 이보다 더 좋은 방법이 있습니까?
MatchCollection mc = Regex.Matches(strText, @"\b[A-Za-z-']+\b");
string[] strArray = new string[mc.Count];
for (int i = 0; i < mc.Count;i++ )
{
strArray[i] = mc[i].Groups[0].Value;
}
추신 : mc.CopyTo(strArray,0)
예외가 발생합니다.
소스 배열에서 하나 이상의 요소를 대상 배열 유형으로 캐스트 할 수 없습니다.
시험:
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>()
.Select(m => m.Value)
.ToArray();
Dave Bish의 대답은 훌륭하고 제대로 작동합니다.
그것의 가치에 주목하지만 대체 그 Cast<Match>()
와 OfType<Match>()
의지 속도 일까지.
코드는 다음과 같습니다.
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
결과는 정확히 동일하지만 (정확히 동일한 방식으로 OP의 문제를 해결 함) 큰 문자열의 경우 더 빠릅니다.
테스트 코드 :
// put it in a console application
static void Test()
{
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";
Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
strText = sb.ToString();
sw.Start();
var arr = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.OfType<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("OfType: " + sw.ElapsedMilliseconds.ToString());
sw.Reset();
sw.Start();
var arr2 = Regex.Matches(strText, @"\b[A-Za-z-']+\b")
.Cast<Match>()
.Select(m => m.Groups[0].Value)
.ToArray();
sw.Stop();
Console.WriteLine("Cast: " + sw.ElapsedMilliseconds.ToString());
}
출력은 다음과 같습니다.
OfType: 6540
Cast: 8743
들어 매우 긴 문자열 캐스트 () 때문에 느립니다.
I ran the exact same benchmark that Alex has posted and found that sometimes Cast
was faster and sometimes OfType
was faster, but the difference between both was negligible. However, while ugly, the for loop is consistently faster than both of the other two.
Stopwatch sw = new Stopwatch();
StringBuilder sb = new StringBuilder();
string strText = "this will become a very long string after my code has done appending it to the stringbuilder ";
Enumerable.Range(1, 100000).ToList().ForEach(i => sb.Append(strText));
strText = sb.ToString();
//First two benchmarks
sw.Start();
MatchCollection mc = Regex.Matches(strText, @"\b[A-Za-z-']+\b");
var matches = new string[mc.Count];
for (int i = 0; i < matches.Length; i++)
{
matches[i] = mc[i].ToString();
}
sw.Stop();
Results:
OfType: 3462
Cast: 3499
For: 2650
One could also make use of this extension method to deal with the annoyance of MatchCollection
not being generic. Not that it's a big deal, but this is almost certainly more performant than OfType
or Cast
, because it's just enumerating, which both of those also have to do.
(Side note: I wonder if it would be possible for the .NET team to make MatchCollection
inherit generic versions of ICollection
and IEnumerable
in the future? Then we wouldn't need this extra step to immediately have LINQ transforms available).
public static IEnumerable<Match> ToEnumerable(this MatchCollection mc)
{
if (mc != null) {
foreach (Match m in mc)
yield return m;
}
}
Consider the Following Code...
var emailAddress = "joe@sad.com; joe@happy.com; joe@elated.com";
List<string> emails = new List<string>();
emails = Regex.Matches(emailAddress, @"([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})")
.Cast<Match>()
.Select(m => m.Groups[0].Value)
.ToList();
Good Luck!
참고URL : https://stackoverflow.com/questions/11416191/converting-a-matchcollection-to-string-array
'Programing' 카테고리의 다른 글
내 모델 유효성 검사를 우회하는 Factory-girl create (0) | 2020.11.07 |
---|---|
이진 문자열을 십진수로 변환하는 방법? (0) | 2020.11.07 |
Elixir에서 현재 날짜 및 / 또는 시간 가져 오기 (0) | 2020.11.07 |
IntelliJ UI를 기본값으로 재설정 (0) | 2020.11.07 |
입력 문자열의 형식이 잘못되었습니다 (0) | 2020.11.07 |