디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

linq 다른언어용으로 비슷하게 만든거앱에서 작성

발명도둑잡기(118.216) 2025.11.26 18:27:08
조회 89 추천 0 댓글 2

챗지피티
LINQ와 비슷한 개념(쿼리식/함수형 컬렉션 처리)을 다른 언어에서 구현한 것들을 정리해줄게.
핵심은 “컬렉션/객체에 대해 선언적 쿼리 스타일로 변환·필터·집계”를 제공하는 기능들이다.

LINQ와 가장 유사한 기능을 가진 언어들

1) Java – Stream API

LINQ 영향 가장 크게 받은 기능

list.stream() .filter(x -> x > 10) .map(x -> x * 2) .collect(Collectors.toList());

지연 실행(Lazy)

Select/Where/GroupBy와 매우 비슷

단, 쿼리 문법은 없고 메서드 체이닝 방식

2) – Array Methods / Lodash

기본 내장 메서드

arr.filter(x => x > 10).map(x => x * 2)

Lodash도 Map/Filter/Reduce를 확장한 LINQ 느낌의 라이브러리

_.chain(arr).filter(...).map(...).value();

3) Python – List Comprehension / itertools / pandas

List Comprehension

[x*2 for x in arr if x > 10]

itertools (지연 실행)

filter(lambda x: x > 10, arr)

pandas → SQL/LINQ와 거의 동일

df[df.age > 30].groupby("city").mean()

4) Kotlin – Sequence / Collections API

list.filter { it > 10 }.map { it * 2 }

Java Stream보다 직관적

LINQ와 구조적으로 매우 유사

5) Scala – Collections / Lazy Streams

arr.filter(_ > 10).map(_ * 2)

완전 함수형 스타일로 LINQ와 상당히 가까움.

6) Rust – Iterator

arr.ㅡiter() .filter(|x| *x > 10) .map(|x| x * 2) .collect::<Vec<_>>();

지연 실행 + 체이닝 = LINQ와 매우 유사.

7) F# – Seq / List / Array modules

arr |> Seq.filter (fun x -> x > 10) |> Seq.map (fun x -> x * 2)

C#과 같은 .NET 패밀리라 LINQ와 거의 동일한 철학 공유.

8) Swift – Functional Sequence API

arr.filter { $0 > 10 }.map { $0 * 2 }

9) Ruby – Enumerable

arr.select { |x| x > 10 }.map { |x| x * 2 }

“LINQ 자체를 다른 언어로 포팅한 프로젝트”

“LINQ를 흉내 낸 라이브러리”들도 있다:

라이브러리언어특징jinqJavaLINQ 스타일 APIlinq.jsC# LINQ를 거의 그대로 구현RxJS / RxJavaJS / JavaLINQ to s + LINQ to Events 철학morelinqC#LINQ 확장linq4jJavaApache Calcite 기반, SQL 같은 쿼리 가능

결론

LINQ는 독자적인 문법(Query Syntax)까지 가진 특이한 성공 사례지만,
“컬렉션을 쿼리하듯 다루는 함수형 API”는 거의 모든 현대 언어가 제공한다.

가장 LINQ스럽다고 평가되는 언어 TOP 3

Java Stream

Kotlin Sequence

Scala Collections

필요하다면
각 언어별 LINQ 대응 표,
LINQ 스타일 DSL 만들기,
C# LINQ 기능을 다른 언어로 포팅하는 방법
도 만들어줄까?

좋아, C# LINQ처럼 동작하는 DSL(도메인 특화 언어)을 만드는 방법
*“직접 구현 가능한 최소 예제 + 확장 방식”*까지 아주 구체적으로 정리해줄게.

아래는 언어 불문 공통 설계 원리 → 예제 구현(파이썬/자바스크립트/자바 중 선택형) → 확장 패턴 순서로 설명한다.

1. LINQ DSL의 핵심 개념 4가지

LINQ는 크게 다음 4개만 구현하면 “동작하는 DSL”이 된다:

① Enumerable(Sequence) 타입

내부적으로 iterable 보관

지연 실행 또는 즉시 실행 중 선택

② 연산자 (Where, Select, GroupBy…)

함수 체이닝 지원

식(expression)을 인자로 받음

새로운 Sequence 리턴 → 불변성 유지

③ 쿼리 엔진

체인된 연산자를 순서대로 평가

Lazy evaluation을 하면 성능이 매우 비슷해짐

④ (선택) Query Syntax → Method Syntax 변환기

C#은

from x in data where x > 10 select x * 2

을 내부적으로

data.Where(x => x > 10).Select(x => x * 2)

로 바꾼다.
이건 선택 사항.

2. 최소 기능 LINQ DSL을 직접 구현하기 (언어 무관 알고리즘)

Sequence 클래스 구조

Sequence { source : iterable ops : list of operations where(func) select(func) toList() }

Lazy pipeline

각 연산을 “기계적으로” 이어붙이면 된다:

ops = [ ("where", lambda x: x > 10), ("select", lambda x: x * 2), ]

평가할 때:

for item in source: if all where(item): item = select(item) yield item

3. 완전 작동하는 실제 DSL 구현 예제

언어 하나 고르는 대신 가장 짧고 명확한 파이썬 버전을 기준으로 보여줄게.
(원하면 Java 또는 JS로도 만들어줄게.)

파이썬 LINQ DSL 구현 (Lazy)

class Query: def __init__(self, source): self.source = source self.ops = [] def where(self, func): self.ops.append(("where", func)) return self def select(self, func): self.ops.append(("select", func)) return self def __iter__(self): for item in self.source: ok = True value = item for op, fn in self.ops: if op == "where": if not fn(value): ok = False break elif op == "select": value = fn(value) if ok: yield value def toList(self): return list(iter(self))

사용법

q = Query([1,2,3,4,5,6]) \ .where(lambda x: x % 2 == 0) \ .select(lambda x: x * 10) print(q.toList()) # [20, 40, 60]

LINQ의 핵심 형태를 그대로 재현했다.

4. “쿼리 문법”까지 만들기 (선택)

C#의 LINQ Query Syntax처럼 만들고 싶다면
아래 같은 "미니 파서"를 만들면 된다.

예시 문법:

from x in data where x > 10 select x * 2

파서 아이디어:

def parse(query_string, env): # 라인별로 분해 # 변수명 / source / 조건 / 선택 식 파싱 # ast로 변환 후 Query(...) 메서드 체인으로 출력

가능한 단순 구현 예:

def linq(q, env): lines = [l.strip() for l in q.strip().split("\n")] var, src = lines[0].split()[1], env[lines[0].split()[3]] query = Query(src) for line in lines[1:]: if line.startswith("where"): expr = line[len("where "):] query = query.where(lambda x, e=expr: [...]) elif line.startswith("select"): expr = line[len("select "):] query = query.select(lambda x, e=expr: [...]) return query

사용:

dsl = """ from x in data where x % 2 == 0 select x * 10 """ print(linq(dsl, {"data": [1,2,3,4,5,6]}).toList())

5. DSL 확장 포인트

이후에는 다음 것들을 추가할 수 있다.

• Join

Cross product + 필터

• GroupBy

키→아이템 리스트 dict 만들어서 Sequence로 감쌈

• OrderBy / ThenBy

파이프라인 마지막에서 sort

• SelectMany

flatMap

• Aggregate / Sum / Min / Max

즉시 평가 함수

• Deferred vs Immediate Execution 선택

실제 LINQ와 동일한 구조 구현 가능

원하면 더 만들어줄 수 있는 것

아래 중에 원하는 걸 말해줘:

Java 스타일 Stream 기반 DSL

용 LINQ.js 직접 구현

C# LINQ 기능 30개 전부 지원하는 DSL 풀버전

Query Syntax를 미니 SQL처럼 확장

타입 안전 LINQ DSL (Kotlin/TS)

어떤 스타일로 계속 만들어줄까?


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
2905385 디시는 모자이크 안되냐 네이버 지식in은 되던데 모자이크 기능 오늘 처음 넥도리아(220.74) 11.29 37 0
2905384 The Studio, By Daniel K. Robbins, n.d., 발명도둑잡기(118.216) 11.29 23 0
2905380 유럽처럼 민주노총 IT산별노조가 크면 된다 발명도둑잡기(118.216) 11.29 21 0
2905379 1893년 미국, 세계 최초로 자전거를 탄 여성 발명도둑잡기(118.216) 11.29 26 0
2905378 내년 만 30세 경력 1년 6개월인데 다시 취업될 수 있을까? 프갤러(119.201) 11.29 37 0
2905376 마소 주식 0.001주 3번 샀는데 내려갔는데 이거 못파나요? 넥도리아(220.74) 11.29 35 0
2905374 핵반응로 논쟁은 금방 끝나고 자전거 창고 논쟁은 길다는 역설 발명도둑잡기(118.216) 11.29 27 0
2905371 나도 맨날 대표랑 싸웠지 [2] 프갤러(110.8) 11.29 85 0
2905367 세계최초 탄력적 가상 아레나 아키텍처 설계 완료함. 나르시갤로그로 이동합니다. 11.29 42 0
2905365 리액트 배울때 헛짓거리한거 기억나네 ㅇㅇ(113.59) 11.29 54 0
2905364 리액트 배우기 귀찮아서 웹프로젝트 할땐 바이브코딩한다 프갤러(118.235) 11.29 48 0
2905363 국장이랑 미장 할 때 기분 차이 [4] chironpractor갤로그로 이동합니다. 11.29 82 1
2905362 우리 회사 대리세끼 대표랑 맨날 싸움 [10] ㅇㅇ(221.168) 11.28 84 0
2905360 DB에서 count(*) 얘는 자원 많이 쓰는 작업임? [4] 프갤러(58.29) 11.28 81 0
2905359 남지현, '은애하는 도적님아'로 이어갈 사극 불패 신화 발명도둑잡기(118.216) 11.28 59 0
2905356 입시 면접 FM 합격 솔루션(필승 전략 해법)!U 프갤러(121.142) 11.28 66 2
2905353 조갑제도 “국힘은 이적단체”…여당은 ‘내란 가짜뉴스’ 대응 중 발명도둑잡기(118.216) 11.28 33 0
2905352 해외 투자 증세에 관해 [3] 발명도둑잡기(118.216) 11.28 106 0
2905351 나님 달러 미국주식 풀매수중 ㅇㅅㅇ [5] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 77 0
2905350 미국주식갤에서 친미매국노들 욕하다가 차단당함 [3] 손발이시립디다갤로그로 이동합니다. 11.28 56 0
2905349 이태원 발언으로 모욕죄 벌금 100만원 싸게쳤다 vs 과하다 [5] ㅇㅇ(39.7) 11.28 85 0
2905348 영어를 못해서 구글을 못가네 [1] ㅇㅇ갤로그로 이동합니다. 11.28 57 0
2905345 원티드 자격요건은 거기 직원들도 다 못할거 같은데 ㅇㅇ(182.228) 11.28 40 0
2905344 이태원 모욕죄로 100만원 벌금받았는데 걍 목매달고 죽을까 [2] ㅇㅇ(39.7) 11.28 72 0
2905343 오픈소스에서는 취약점을 감시하는 사람이 더 많다 발명도둑잡기(118.216) 11.28 43 0
2905342 사타구니 털 제모하면 이상한 사람인가요? [5] 넥도리아(220.74) 11.28 62 0
2905341 노말틱도 말해주잖아 오픈소스의 취약점 [1] ㅇㅇ(114.30) 11.28 61 0
2905340 <복면가왕> 관련 생각나는 예전 글 발명도둑잡기(118.216) 11.28 54 0
2905339 정치가 어쨌든 나라가 어쨌든 국가가 어쨌든 삶이 어쨌든 [8] 넥도리아(220.74) 11.28 76 0
2905338 이태원 모욕죄로 구약식 벌금100만원 = 재산잃고 전과남고 인생조진거지? [11] ㅇㅇ(39.7) 11.28 75 0
2905337 저좀 어떻게 성공시켜 주실 분 없나요? [2] 넥도리아(220.74) 11.28 61 0
2905335 사실 제가 틀딱이 아니라 귀여운 여자임을 인증합니다 [6] 헬마스터갤로그로 이동합니다. 11.28 87 0
2905332 페이커닮은 개발자 찾습니다 프갤러(106.101) 11.28 42 0
2905331 진짜 크게 벌리는 건 아니고… 그냥 생활비용 차트부자(1.233) 11.28 37 0
2905325 ❤✨☀⭐⚡☘⛩☃나님 시작합니당☃⛩☘⚡⭐☀✨❤ ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 62 0
2905324 프로그래머, 내가 하다 하다 3D 공부한다. [3] 프갤러(59.16) 11.28 85 1
2905319 출퇴근길에 소소하게 짭짤하네요 존버장군(1.233) 11.28 59 0
2905316 나 좀 찾지 말아달라고 했음 ㅇㅇ(211.234) 11.28 51 0
2905313 나 아까 실수했네 발명도둑잡기(118.216) 11.28 45 0
2905299 서울 유명 스웨디시 후기 모음집 ㅇㅇ(118.235) 11.28 61 0
2905298 어제부터 저녁에 배가 안 고픔;; [6] ♥멘헤라냥덩♥갤로그로 이동합니다. 11.28 84 0
2905297 클래스 101 결제해본 사람있나 ㅇㅇ(140.248) 11.28 55 0
2905296 국비 말고 혼자 자격증 따서 취직하는것도 가능함? [1] ㅇㅇ갤로그로 이동합니다. 11.28 71 0
2905294 후 시발 이런건 15분만에 최라락 써서 뚝딱 해야하는건데 프갤러(14.52) 11.28 53 0
2905293 회원가입 겨우 완성했다. 프갤러(14.52) 11.28 54 0
2905292 <서울 자가에 대기업 다니는 김부장 이야기>관련 생각나는 글 발명도둑잡기(118.216) 11.28 98 0
2905291 맨땅에 헤딩하기에는 c가 가장 적절한듯 ㅇㅇ(118.235) 11.28 44 0
2905289 AI 로 뚝딱해서 돈 벌었다는 사람 통장 까봐. [1] 프갤러(59.16) 11.28 54 2
2905288 미디어에서 AI 로 1 분만에 뚝딱 개발했다니까 정말 그런줄 알아. 프갤러(59.16) 11.28 52 1
2905287 프로그래머가 되려면 꿈과 희망을 버려라. [3] 프갤러(59.16) 11.28 82 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2