소개 확장 메소드를 사용하기 시작한 이후로 나는 그것을 사용하는 것을 멈출 수가 없었습니다. 이 메소드는 내 코드 작성의 효율성을 크게 향상시켰고 이제는 확장 메소드에 크게 의존하게 되었습니다. 모두의 편의를 위해 제가 자주 사용하는 확장 방법을 여기서 설정해 공유하고 싶습니다.
(일부 내용은 다른 블로거의 글에서 차용하거나 차용한 것입니다. 특히 많은 공유를 해주신 He Chongtian에게 감사드립니다.)
소스 코드는 기사 마지막 부분에 제공됩니다.
예
공개 정적 문자열 ExpandAndToString(이 System.Collections.IEnumerable s, 문자열 공백 문자)
기능: 컬렉션을 확장하고 ToString 메서드를 각각 실행한 다음 지정된 구분 기호로 연결하여 문자열로 연결합니다.
예:
[테스트 방법]
공개 무효 TestMethod1()
{
var i = new int[] {1,5,33,14,556};
var 출력="1-5-33-14-556";
Assert.AreEqual(Out,i.ExpandAndToString("-"));
}
public static bool IsNullOrEmpty(이 문자열 s)
기능: 문자열 개체가 빈 개체인지 빈 문자열인지 확인합니다.
예:
[테스트 방법]
공공 무효 TestMethod2()
{
문자열 s = null;
Assert.AreEqual(true,s.IsNullOrEmpty());
s += "123";
Assert.AreEqual(false, s.IsNullOrEmpty());
}
공개 정적 문자열 IsNullOrEmptyThen(이 문자열 s, System.Func<string,string> 표현식)
함수: 문자열 개체가 빈 개체인지 빈 문자열인지 확인합니다. 그렇다면 들어오는 식을 실행하고 식 결과를 반환합니다.
예:
[테스트 방법]
공공 무효 TestMethod3()
{
vars = "";
var 출력 = "1234";
Assert.AreEqual(Out, s.IsNullOrEmptyThen(f=>"1234"));
}
공개 정적 무효 IsNullOrEmptyThen(이 문자열 s, System.Action<string> 표현식)
기능: 문자열 개체가 빈 개체인지 빈 문자열인지 확인하고, 그렇다면 들어오는 표현식을 실행합니다.
예:
[테스트 방법]
공공 무효 TestMethod4()
{
vars = "";
s.IsNullOrEmptyThen(f => MessageBox.Show("콘텐츠 없음"));
}
공개 정적 문자열 FormatWith(이 문자열 s, params object[] 형식 매개변수)
공개 정적 문자열 FormatWith(이 문자열 s, 개체 형식 매개 변수 1)
public static string FormatWith(이 문자열은 s, 개체 형식 매개변수 1, 개체 형식 매개변수 2)
public static string FormatWith(이 문자열 s, 개체 형식 매개변수 1, 개체 형식 매개변수 2, 개체 형식 매개변수 3)
기능: 형식 문자열.
예:
[테스트 방법]
공공 무효 TestMethod5()
{
var i = 0.35;
변수 x = 200;
var 출력 = "i:35%;x:200;";
Assert.AreEqual(Out, "i:{0:0%};x:{1};".FormatWith(i,x));
}
public static bool In<T>(this T t, params T[] 판단 기준)
기능: 현재 개체가 들어오는 배열에 있는지 확인합니다.
예:
[테스트 방법]
공공 무효 TestMethod6()
{
변수 i = 95;
Assert.IsTrue(i.In(31, 3, 55, 67, 95, 12, 4));
}
public static bool In<T, C>(this T t, System.Func<T,C,bool> 판단 식, params C[] 판단 기준)
기능: 현재 객체가 들어오는 배열에 있는지 확인합니다. 판단 방법은 들어오는 표현식에 의해 지정됩니다.
예:
[테스트 방법]
공공 무효 TestMethod7()
{
변수 i = 95;
Assert.IsTrue(i.In((c, t) => c.ToString() == t, "31", "3", "55", "67", "95", "12", "4 "));
}
public static bool InRange<T>(this System.IComparable<T> t, T 최소값, T 최대값)
public static bool InRange(이 System.IComparable t, 개체 최소값, 개체 최대값)
기능: 현재 값이 지정된 범위 내에 있는지 확인합니다.
예:
[테스트 방법]
공공 무효 TestMethod8()
{
변수 i = 95;
Assert.IsTrue(i.InRange(15, 100));
Assert.IsTrue(i.InRange(-3000, 300));
Assert.IsFalse(i.InRange(-1, 50));
vars = "b";
Assert.IsTrue(s.InRange("a", "c"));
Assert.IsTrue(s.InRange("1", "z"));
Assert.IsFalse(s.InRange("e", "h"));
}
공개 정적 T Trace<T>(이 T t)
public static T Trace<T>(이 T t, 문자열 분류)
public static T Trace<T>(this T t, System.Func<T,object> 표현식)
public static T Trace<T>(this T t, System.Func<T,object> 표현식, 문자열 분류)
기능: 현재 개체의 값을 Visual Studio 출력 창에 출력하고 원본 개체를 반환합니다. 이 함수는 디버깅을 용이하게 하기 위해서만 사용됩니다. 메소드 체인의 연속성에 영향을 주지 않고 메소드 체인의 모든 단계에서 값을 출력할 수 있습니다.
예:
[테스트 방법]
공공 무효 TestMethod9()
{
var s = "abcdefg".Trace(f => f.ToUpper(), "표현 모드").Remove(4).Trace("일반 모드");
var 출력 = "abcd";
Assert.AreEqual(Out, s);
//출력 내용은 다음과 같습니다.
//표현 패턴: ABCDEFG
//일반 모드: abcd
}
public static T TraceFormat<T>(이 T t, 문자열 형식 문자열)
public static T TraceFormat<T>(이 T t, 문자열 형식 문자열, 문자열 분류)
기능: 포맷 후 현재 개체의 값을 Visual Studio 출력 창에 출력하고, 원본 개체를 반환합니다. 이 함수는 디버깅을 용이하게 하기 위해서만 사용됩니다. 메소드 체인의 연속성에 영향을 주지 않고 메소드 체인의 모든 단계에서 값을 출력할 수 있습니다.
예:
[테스트방법]
공공 무효 TestMethod10()
{
var m = Math.Max(0.31, 0.65).TraceFormat("최대 값은 {0}", "형식 지정 모드");
varOut = 0.65;
Assert.AreEqual(Out, m);
//출력 내용은 다음과 같습니다.
//포맷 모드: 최대값은 0.65입니다.
}
공개 정적 무효 ForEach<T>(이 System.Collections.Generic.IEnumerable<T> 소스, System.Action<T> 작업)
public static void ForEach<T>(이 System.Collections.Generic.IEnumerable<T> 소스, System.Action<T,int> 작업)
기능: 컬렉션을 탐색하고 지정된 작업을 수행합니다. (오버로드된 형식에서 표현식에 전달된 int 유형 매개변수는 현재 루프 수를 나타냅니다.)
예:
[테스트 방법]
공공 무효 TestMethod11()
{
var l = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var c = 0;
l.ForEach(f => c += f);
varOut = 45;
Assert.AreEqual(Out, c);
l.ForEach((f, i) => c -= i);
아웃 = 9;
Assert.AreEqual(Out, c);
}
공개 정적 스위치<T> 스위치<T>(이 T v)
public static Case<T,R> Switch<T, R>(this T v, System.Func<R,R,R> Do)
기능: 현재 값을 결정하고, 해당 작업을 수행하거나, 다양한 일치 조건에 따라 해당 값을 반환합니다. (오버로드된 형식에서는 각 반환 값이 표현식을 통해 중첩될 수 있습니다.)
자세한 지침은 "약간 개선된 스위치/케이스 확장 방법"을 참조하십시오.
예:
[테스트 방법]
공공 무효 TestMethod12()
{
var i = 15;
i.스위치()
.CaseRun(15, f => MessageBox.Show("15와 같음"),false)
.CaseRun(f => f > 0, f => MessageBox.Show("0보다 큼"))
.CaseRun(f => f < 0, f => MessageBox.Show("0보다 작음"))
.DefaultRun(f => MessageBox.Show("0과 같음"));
var o = 'c'.스위치()
.CaseReturn('a', 1)
.CaseReturn('b', 2)
.CaseReturn('c', 3)
.CaseReturn('d', 4)
.CaseReturn(f => f > 'd', 5)
.DefaultReturn(0).ReturnValue;
Assert.AreEqual(3, o);
}
public static System.Collections.Generic.IEnumerable<T> RecursionSelect<T>(this To, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식)
public static System.Collections.Generic.IEnumerable<T> RecursionSelect<T>(this To, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식, System.Predicate<T> 테스트 식)
기능: 항목을 재귀적으로 선택하고 최종 선택된 컬렉션을 반환합니다.
관련 원칙에 대한 설명은 "C# 확장 메서드의 멋진 사용에 대한 고급 7부: "트리" Universal Traverser"를 참조하세요.
예:
[테스트 방법]
공공 무효 TestMethod13()
{
//지정된 디렉터리의 하위 디렉터리를 포함하는 모든 디렉터리 컬렉션을 가져옵니다.
var d = new DirectoryInfo(@"C:UsersPublicDownloads");
var c = d.RecursionSelect(f => f.GetDirectories(), f => f.GetDirectories().Length > 0);
MessageBox.Show(c.Count().ToString());
}
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.IEnumerable o, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식)
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.IEnumerable o, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식, System.Predicate<T> 테스트 식 모드 )
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.Generic.IEnumerable<T> o, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식)
public static System.Collections.Generic.IEnumerable<T> RecursionEachSelect<T>(this System.Collections.Generic.IEnumerable<T> o, System.Func<T,IEnumerable<T>> 재귀 항목 선택 식, System.Predicate < T> 테스트 표현)
기능: 현재 컬렉션 객체를 순회하고, 항목을 하나씩 재귀적으로 선택하고, 최종 선택된 컬렉션을 반환합니다.
관련 원칙에 대한 설명은 "C# 확장 메서드의 멋진 사용에 대한 고급 7부: "트리" Universal Traverser"를 참조하세요.
예:
[테스트 방법]
공공 무효 TestMethod14()
{
//지정된 디렉터리의 하위 디렉터리를 포함하는 모든 디렉터리 컬렉션을 가져옵니다.
var l = new List<DirectoryInfo>();
l.Add(new DirectoryInfo(@"C:UsersSkyDDownloads"));
l.Add(new DirectoryInfo(@"C:UsersPublicDownloads"));
var c = l.RecursionEachSelect(f => f.GetDirectories(), f => f.GetDirectories().Length > 0);
MessageBox.Show(c.Count().ToString());
}
public static bool RegexIsMatch(이 문자열 s, 문자열 표현식, System.Text.RegularExpressions.RegexOptions 옵션)
public static bool RegexIsMatch(이 문자열 s, 문자열 표현식)
공개 정적 System.Text.RegularExpressions.Match RegexMatch(이 문자열 s, 문자열 표현식, System.Text.RegularExpressions.RegexOptions 옵션)
공개 정적 System.Text.RegularExpressions.Match RegexMatch(이 문자열 s, 문자열 표현식)
공개 정적 System.Text.RegularExpressions.MatchCollection RegexMatches(이 문자열 s, 문자열 표현식, System.Text.RegularExpressions.RegexOptions 옵션)
공개 정적 System.Text.RegularExpressions.MatchCollection RegexMatches(이 문자열 s, 문자열 표현식)
공개 정적 문자열 RegexReplace(이 문자열 s, 문자열 표현식, 문자열 대체 값, System.Text.RegularExpressions.RegexOptions 옵션)
공개 정적 문자열 RegexReplace(이 문자열 s, 문자열 표현식, 문자열 대체 값)
공개 정적 문자열[] RegexSplit(이 문자열 s, 문자열 표현식, System.Text.RegularExpressions.RegexOptions 옵션)
public static string[] RegexSplit(이 문자열 s, 문자열 표현식)
기능: 일반적으로 사용되는 정규식 함수 캡슐화, 사용 방법은 Regex 클래스와 동일합니다.
public static T As<T>(이 문자열 s) where T : new(), 일반 확장.SpecialString
공개 정적 범용 확장.HtmlString AsHtmlString(이 문자열 s)
공용 정적 범용 확장.PathString AsPathString(이 문자열 s)
공용 정적 범용 확장.ServerPathString AsServerPathString(이 문자열 s)
공용 정적 범용 확장.UriString AsUriString(이 문자열 s)
공개 정적 범용 확장.XHtmlString AsXHtmlString(이 문자열 s)
공용 정적 범용 확장.XmlString AsXmlString(이 문자열 s)
기능: 고유한 형식 지정 명령을 사용하여 추가로 수정할 수 있는 특수한 유형의 문자열로 정의됩니다. (현재 정의 후 후속 포맷 기능은 상대적으로 제한적이며 향후 점진적으로 추가될 예정입니다)
예:
[테스트방법]
공공 무효 TestMethod15()
{
var s = @"C:abc";
var Out = @"C:abc1.exe";
Assert.AreEqual(Out, s.AsPathString().Combine(@"D:1.exe".AsPathString().FileName));
}
결론 이것은 여기에서 가장 자주 사용되는 확장 기능입니다. 모든 사람에게 동일하게 유용하기를 바랍니다. :)
확장 메소드 소스 코드 다운로드: http://www.uushare.com/user/icesee/file/2435046
샘플 소스 코드: http://www.uushare.com/user/icesee/file/2435063
이 기사의 XPS 버전: http://www.uushare.com/user/icesee/file/2435098