참고 :이 게시물은 훨씬 더 자세하게 작성되어 주제에서 벗어났습니다. 사과드립니다.
내 동료들은 그것을 읽고 그것이 '어딘가'에 가치 있다고 믿습니다. 이 실은 장소가 아닙니다. 이것이 어디로 가야하는지에 대한 귀하의 의견에 감사드립니다 (저는 사이트를 처음 사용합니다).
어쨌든 이것은 정의 된 의미 체계를 사용하는 모든 컬렉션 유형에서 작동한다는 점에서 놀라운 .NET 3.5의 C # 버전입니다. 이것은 대부분의 일반적인 개발 시나리오에서 성능이나 CPU주기 최소화가 아닌 기본 측정 (재사용!)이지만 실제 환경에서 발생하는 것처럼 보이지는 않습니다 (조기 최적화).
*** 모든 컬렉션 유형에 대해 작동하고 유형의 단일 값을 예상하는 작업 대리자를 취하는 확장 메서드, 모두 역순으로 각 항목에 대해 실행 **
요구 사항 3.5 :
public static void PerformOverReversed<T>(this IEnumerable<T> sequenceToReverse, Action<T> doForEachReversed)
{
foreach (var contextItem in sequenceToReverse.Reverse())
doForEachReversed(contextItem);
}
이전 .NET 버전 또는 Linq 내부를 더 잘 이해하고 싶습니까? 계속 읽어봐 .. 아니면 ..
가정 : .NET 유형 시스템에서 Array 유형은 IEnumerable 인터페이스에서 상속됩니다 (일반 IEnumerable 전용 IEnumerable이 아님).
이것은 처음부터 끝까지 반복하는 데 필요한 전부이지만 반대 방향으로 이동하고 싶습니다. IEnumerable이 '객체'유형의 배열에서 작동하므로 모든 유형이 유효합니다.
중요 측정 : '더 나은'시퀀스를 역순으로 처리 할 수 있다면 정수에서만 처리 할 수 있다고 가정합니다.
.NET CLR 2.0-3.0 용 솔루션 A :
설명 : 포함 된 각 인스턴스가 동일한 유형임을 요구하는 모든 IEnumerable 구현 인스턴스를 허용합니다. 따라서 배열을 받으면 전체 배열에 X 유형의 인스턴스가 포함됩니다. 다른 인스턴스가! = X 유형이면 예외가 발생합니다.
싱글 톤 서비스 :
공용 클래스 ReverserService {개인 ReverserService () {}
/// <summary>
/// Most importantly uses yield command for efficiency
/// </summary>
/// <param name="enumerableInstance"></param>
/// <returns></returns>
public static IEnumerable ToReveresed(IEnumerable enumerableInstance)
{
if (enumerableInstance == null)
{
throw new ArgumentNullException("enumerableInstance");
}
// First we need to move forwarad and create a temp
// copy of a type that allows us to move backwards
// We can use ArrayList for this as the concrete
// type
IList reversedEnumerable = new ArrayList();
IEnumerator tempEnumerator = enumerableInstance.GetEnumerator();
while (tempEnumerator.MoveNext())
{
reversedEnumerable.Add(tempEnumerator.Current);
}
// Now we do the standard reverse over this using yield to return
// the result
// NOTE: This is an immutable result by design. That is
// a design goal for this simple question as well as most other set related
// requirements, which is why Linq results are immutable for example
// In fact this is foundational code to understand Linq
for (var i = reversedEnumerable.Count - 1; i >= 0; i--)
{
yield return reversedEnumerable[i];
}
}
}
public static class ExtensionMethods
{
public static IEnumerable ToReveresed(this IEnumerable enumerableInstance)
{
return ReverserService.ToReveresed(enumerableInstance);
}
}
[TestFixture] 공개 클래스 Testing123 {
/// <summary>
/// .NET 1.1 CLR
/// </summary>
[Test]
public void Tester_fornet_1_dot_1()
{
const int initialSize = 1000;
// Create the baseline data
int[] myArray = new int[initialSize];
for (var i = 0; i < initialSize; i++)
{
myArray[i] = i + 1;
}
IEnumerable _revered = ReverserService.ToReveresed(myArray);
Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
}
[Test]
public void tester_why_this_is_good()
{
ArrayList names = new ArrayList();
names.Add("Jim");
names.Add("Bob");
names.Add("Eric");
names.Add("Sam");
IEnumerable _revered = ReverserService.ToReveresed(names);
Assert.IsTrue(TestAndGetResult(_revered).Equals("Sam"));
}
[Test]
public void tester_extension_method()
{
// Extension Methods No Linq (Linq does this for you as I will show)
var enumerableOfInt = Enumerable.Range(1, 1000);
// Use Extension Method - which simply wraps older clr code
IEnumerable _revered = enumerableOfInt.ToReveresed();
Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
}
[Test]
public void tester_linq_3_dot_5_clr()
{
// Extension Methods No Linq (Linq does this for you as I will show)
IEnumerable enumerableOfInt = Enumerable.Range(1, 1000);
// Reverse is Linq (which is are extension methods off IEnumerable<T>
// Note you must case IEnumerable (non generic) using OfType or Cast
IEnumerable _revered = enumerableOfInt.Cast<int>().Reverse();
Assert.IsTrue(TestAndGetResult(_revered).Equals(1000));
}
[Test]
public void tester_final_and_recommended_colution()
{
var enumerableOfInt = Enumerable.Range(1, 1000);
enumerableOfInt.PerformOverReversed(i => Debug.WriteLine(i));
}
private static object TestAndGetResult(IEnumerable enumerableIn)
{
// IEnumerable x = ReverserService.ToReveresed(names);
Assert.IsTrue(enumerableIn != null);
IEnumerator _test = enumerableIn.GetEnumerator();
// Move to first
Assert.IsTrue(_test.MoveNext());
return _test.Current;
}
}