저는 F #을 처음 접했고 대부분 C # 배경을 가지고 있습니다. 나는 동일한 것을 나타내지 만 다른 데이터 소스에서 두 개의 목록 / 시퀀스로 작업하고 있습니다 (하나는 로컬 파일이고 다른 하나는 온라인 시스템의 항목 그룹입니다.
두 데이터 세트 간의 불일치를보고해야합니다.
지금까지 다른 데이터 세트에서 불일치가없는 항목 만 포함하도록 두 목록을 필터링했습니다.
이제 차이점을 기록 할 수 있도록 속성 중 하나를 기반으로 튜플 (또는 실제로 다른 것)으로 쌍을 이루고 싶습니다.
지금까지 내가 시도한 것은 다음과 같습니다.
let printDiff (offlinePackages: oP seq) (onLinePackages: onP seq) =
Seq.map2(fun x y -> (x, y)) offlinePackages onLinePackages
이것은 내 데이터를 페어링하지만 일치하는 속성 값을 기반으로 페어링을 수행하려면 여전히 몇 가지 논리가 필요합니다. 다음과 같은 것을 찾고 있습니다.
if offLinePackage.Label = OnlinePackage.Label then /do the matchup/
else /don't do anything/
나는 여전히 내 객체 지향적 사고에 갇혀 있다는 것을 알고 있으며, 그것이 내가 묻는 이유이기도합니다.
미리 감사드립니다!
등가 함수를 기반으로 시퀀스 요소 일치-이를 "조인"이라고합니다.
조인을 수행하는 가장 "간단한"방법은 다음과 같이 데카르트 곱을 가져와 필터링하는 것입니다.
let matchup seq1 seq2 =
Seq.allPairs seq1 seq2
|> Seq.filter (fun (x, y) -> x.someProp = y.someProp)
또는 계산 표현식 형식 :
let matchup seq1 seq2
seq {
for x in seq1 do
for y in seq2 do
if x.someProp = y.someProp then yield (x,y)
}
그러나 이것은 약간 비효율적입니다. 가능한 모든 쌍을 반복하기 때문에 복잡성은 O (n * m)입니다. 목록이 짧으면 괜찮지 만 규모를 늘릴수록 물릴 것입니다.
이 작업을보다 효율적으로 수행하려면 해시 조인을 수행하는 query
계산 빌더 및 해당 작업을 사용할 수 있습니다 join
(즉, 먼저 해시 테이블을 빌드 한 다음이를 기반으로 요소를 일치시킵니다).
let matchup seq1 seq2 =
query {
for x in seq1 do
join y in seq2 on (x.someProp = y.someProp)
select (x,y)
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다