2013-02-11 1 views
0

"materialize"는 이와 같은 코드에 적합한 이름입니까, 아니면 더 좋은 (공식적인) 이름이 있습니까?열거 형 : 공식 용어를 "구체화"합니까?

enumerable as ICollection<T> ?? enumerable .ToArray() 

편집 : 확장 방법으로

static void Save(IEnumerable<string> strings) 
{ 
    // The following code is Resharper suggested solution to 
    // "Possible multiple enumeration of IEnumerable" warning 
    // (http://confluence.jetbrains.com/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable): 
    strings = strings as string[] ?? strings.ToArray(); // you're not calling 
                 // ToArray because you 
                 // need an array, here 

    if (strings.Any(s => s.Length >= 255)) throw new ArgumentException(); 

    File.AppendAllLines("my.path.txt", strings); 
} 

첫번째 라인 더 서술 될한다 :

I 문제가

// or "MaterializeIfNecessary" 
public static IEnumerable<T> Materialize<T>(this IEnumerable<T> source) 
{ 
    // if you use code analysis tools like resharper, you may have to return a 
    // different type to turn off warnings - even a placeholder interface like 
    // IMaterializedEnumerable<T> : IEnumerable<T> { } 

    if (source == null) return null; 

    return source as ICollection<T> ?? source.ToArray(); 
} 

코드 (및 목적) 명확히

strings = strings.MaterializeIfNecessary(); 
+3

내가 전화 것'AsReadOnly' 또는'ToReadOnlyCollection' – Magnus

+1

@Magnus는 대답 : BTW 내가 생각해야하는'AsReadOnlyCollection'는 –

+0

가 왜 IReadOnlyCollection에 IEnumerable을 던졌다 더 나은 결과를 설명? http://stackoverflow.com/a/55661/211627 – JDB

답변

1

나는 012라고 말하고 싶습니다.. 이 함수는 실제로 함수가 수행하는 작업에 대한 자세한 정보를 제공합니다.
소스를 구체화하는 것은 ToArray()이 호출 된 경우에만 수행하는 것 같습니다.

+1

IEnumerable은 이미 읽기 전용이므로'AsReadOnlyCollection'이 조금 더 나은 이름이라고 생각합니다 :) –

+0

@lazyberezovsky 네, 그 이름도 사용할 수 있습니다. 특히 함수가 소스 'IEnumerable'을 래핑 한 경우에만 그렇습니다. 그러나 때때로 포장하기 전에 ToArray를 호출하는 것 같습니다. 그래서 To가 더 나은 이름 일 수 있습니다. – Magnus

+0

확장 메소드로서'ToList()'나'ToArray()'처럼 사용할 수 있기 때문에'ToXY'가 가장 좋습니다. 그러나 나는 왜 그것이 필요한지 이해하지 못합니다. –

1

@Magnus가 이미 제안했듯이 ToReadOnlyCollection은 메서드에 대한 설명이 포함 된 좋은 이름입니다. 또한 나는 AsReadOnlyCollection 그 좋은 이름이 아니라고 생각합니다. 일반적으로 AsXXX 메서드는 소스를 숨기거나 감싸지 않습니다. 그러한 메소드는 단순히 source로 이미 구현 된 인터페이스 중 하나로서 source를 반환합니다. 캐스팅 대신 이러한 메서드를 사용할 수 있습니다.

그리고 Materialize은 메소드의 의도에 대해 전혀 알려주지 않습니다. 무슨 뜻이에요? 나는 손으로 내 시퀀스를 만질 수있을 것인가? 종이에 인쇄됩니까? 파일로 저장 되었습니까?

그렇습니다. 이미 읽은 IEnumerableReadOnlyCollection으로 변환해야하는 이유를 이해할 수 없습니다.

+0

원본 'IEnumerable'이 가리키는 기본 모음이 읽기 전용이 아닌 경우 일반 목록으로 캐스팅하고 추가 할 수 있습니다. 컬렉션이 불가능한 읽기 전용 컬렉션 인 경우. – Magnus

+0

http://stackoverflow.com/questions/14819990/enumerable-is-materialize-an-official-term/14820288#comment20761949_14819990 – Notoriousxl

관련 문제