.NET에서 매핑 및 축소


답변:


298

Linq는 Map과 Reduce에 해당합니다. C # 3.5와 Linq는 이미 다른 이름으로 사용하고 있습니다.

  • 지도는 Select:

    Enumerable.Range(1, 10).Select(x => x + 2);
  • 감소 Aggregate:

    Enumerable.Range(1, 10).Aggregate(0, (acc, x) => acc + x);
  • 필터입니다 Where:

    Enumerable.Range(1, 10).Where(x => x % 2 == 0);

https://www.justinshield.com/2011/06/mapreduce-in-c/


1
번역은 정확하지만 핵심 사항이 누락되었습니다. map reduce의 shuffle 단계는 map-reduce에서 중요하지만 이름에 표시되지 않으므로 코드를 작성할 필요가 없습니다. 맵 단계에서 추출 된 키에 의해서만 구동됩니다. Joel Martinez의 대답은 내 의견으로는 더 잘 강조합니다.
xtofs

2
링크가 작동하지 않고 올바른 링크는 다음과 같습니다. justinshield.com/2011/06/mapreduce-in-c
Alexandru-Dan Pop

12
왜 오 왜 그들은 그냥 그것을 Reduce대신에 호출하지 않습니까?Aggregate MS는 프로그래머들을 짜증나게하는 것을 좋아합니다
John Henckel

13
@ JohnHenckel, 나는 권위있는 출처는 아니지만 SQL에서 유래 한 것이 확실합니다. linq는 C #에서 SQL과의 상호 작용을보다 쉽게 ​​만드는 방법으로 원래 구입했다고 생각합니다. 해당 세계에서 함수의 이름을 지정할 때 Select 및 Group By와 같은 항목에 비해 집계가 "감소"보다 조금 더 친숙하게 들리기 시작합니다. 나는 그것이 옳다고 말하지 않고, 끝까지 나를 귀찮게하지만 그것이 그 이유라고 생각합니다.
엘리엇 블랙번

18

mapreduce 스타일 솔루션에 적합한 문제 클래스는 집계 문제입니다. 데이터 세트에서 데이터를 추출합니다. C #에서는 LINQ를 활용하여이 스타일로 프로그래밍 할 수 있습니다.

다음 기사에서 : http://codecube.net/2009/02/mapreduce-in-c-using-linq/

GroupBy 메소드는 맵 역할을하는 반면 Select 메소드는 중간 결과를 최종 결과 목록으로 줄이는 작업을 수행합니다.

var wordOccurrences = words
                .GroupBy(w => w)
                .Select(intermediate => new
                {
                    Word = intermediate.Key,
                    Frequency = intermediate.Sum(w => 1)
                })
                .Where(w => w.Frequency > 10)
                .OrderBy(w => w.Frequency);

분산 부분의 경우 DryadLINQ를 확인하십시오. http://research.microsoft.com/en-us/projects/dryadlinq/default.aspx


3

그 LINQ 그것을 호출 기억할 수 결코 때문에 Where, Select그리고 Aggregate대신에 Filter, Map그리고 Reduce내가 몇 확장 메서드를 만들어 있도록 사용할 수 있습니다 :

IEnumerable<string> myStrings = new List<string>() { "1", "2", "3", "4", "5" };
IEnumerable<int> convertedToInts = myStrings.Map(s => int.Parse(s));
IEnumerable<int> filteredInts = convertedToInts.Filter(i => i <= 3); // Keep 1,2,3
int sumOfAllInts = filteredInts.Reduce((sum, i) => sum + i); // Sum up all ints
Assert.Equal(6, sumOfAllInts); // 1+2+3 is 6

다음은 세 가지 방법입니다 ( https://github.com/cs-util-com/cscore/blob/master/CsCore/PlainNetClassLib/src/Plugins/CsCore/com/csutil/collections/IEnumerableExtensions.cs ) :

public static IEnumerable<R> Map<T, R>(this IEnumerable<T> self, Func<T, R> selector) {
    return self.Select(selector);
}

public static T Reduce<T>(this IEnumerable<T> self, Func<T, T, T> func) {
    return self.Aggregate(func);
}

public static IEnumerable<T> Filter<T>(this IEnumerable<T> self, Func<T, bool> predicate) {
    return self.Where(predicate);
}

https://github.com/cs-util-com/cscore#ienumerable-extensions 에서 자세한 내용을 확인하십시오 .

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.