디시인사이드 갤러리

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

갤러리 본문 영역

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

발명도둑잡기(118.216) 2025.11.26 18:27:08
조회 49 추천 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 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
공지 프로그래밍 갤러리 이용 안내 [97] 운영자 20.09.28 48771 65
2905060 이재명이 잘 하고 잇다는 증거.jpg 야옹아저씨갤로그로 이동합니다. 06:52 2 0
2905058 죽은 인터넷 이론 발명도둑잡기(118.216) 04:54 12 0
2905057 음기 충전 발명도둑잡기(118.216) 04:31 24 0
2905056 북한학자 조희승의 가야사- 임나는 한반도가 아닌 일본 서부지역에 발명도둑잡기(118.216) 04:00 15 0
2905053 영화 <프랑스> 인기래서 생각나는 예전 글 발명도둑잡기(118.216) 03:40 18 0
2905047 내가 예술계 새 트렌드 알려준다 발명도둑잡기(118.216) 03:22 26 0
2905042 지금 분위기가 프갤러(49.165) 03:07 44 0
2905041 Le Solitaire. Theo Mercier 발명도둑잡기(118.216) 02:56 19 0
2905040 DB는 조인을 안하는게 걍 최선인듯 프갤러(58.29) 02:53 26 0
2905038 책사풍후의 게임 엔진 개발 일지_프로젝트 삼국사기 [1] 책사풍후갤로그로 이동합니다. 02:46 27 0
2905036 씨발국가 완전 중국 다 되었네 이딴 병신같은걸로 전과 ㅋㅋㅋㅋ ㅇㅇ(39.7) 02:30 48 0
2905034 ai는 코드를 낳고 ㅇㅇ갤로그로 이동합니다. 02:18 30 1
2905033 노력한 보상을 갈취당하고 주식이란 도박에 몰두하는 시민들 발명도둑잡기(118.216) 02:12 21 0
2905027 위성 쏘는 이유가 나오는 영화 <에너미 오브 더스테이츠> [1] 발명도둑잡기(118.216) 01:59 33 0
2905025 국내에 외국계 기업 특 ) 짱깨랑 양키랑 좇본 인도 대기업들 몰렸는데 타이밍뒷.통수한방(1.213) 01:54 27 0
2905023 윤도현-타잔 발명도둑잡기(118.216) 01:47 19 0
2905022 위성 싸서 좋은점은 짱깨들밖에없잖누 ㅋㅋㅋㅋㅋ 타이밍뒷.통수한방(1.213) 01:41 25 0
2905021 위성 쏘는 이유 중 하나가 야당 감시다 발명도둑잡기(118.216) 01:33 22 0
2905017 내일 또 클리앙새끼를 누리호 ㅇㅈㄹ하면서 난리치겠누 [1] 타이밍뒷.통수한방(1.213) 01:23 35 0
2905015 냥덩이 잡아다가 누리호에 묶어서 쏴올렸다는데? 발명도둑잡기(118.216) 01:17 24 0
2905014 누리호 궤도 진입 성공 대 실패 예상 댓글좀 발명도둑잡기(118.216) 01:09 22 0
2905013 오늘의 영상 기획 실마리: 작품 발표를 로케트 발사처럼 패러디 발명도둑잡기(118.216) 00:58 23 0
2905010 조선이 위성을 쏘아도 한국은 도발이라고 표현하는데 발명도둑잡기(118.216) 00:31 26 0
2905009 법무부 영문 표기가 Ministry of Justice 발명도둑잡기(118.216) 00:14 19 0
2905008 DB 검색할 때 %like%는 걍 없다고 생각하고 써야함? [1] 프갤러(58.29) 00:14 28 0
2905006 이거 항소하면 무죄 내지는 벌금50까지 줄여지냐? 씨발국가야? ㅇㅇ(39.7) 11.26 52 0
2905005 대통령보다 연봉높은 우주청 현실 [1] 타이밍뒷.통수한방(1.213) 11.26 59 0
2905004 개인 자격으로 인공위성 만들어 발사한 미디어아티스트 송호준 [1] 발명도둑잡기(118.216) 11.26 25 0
2905003 해외기사들보면 삼성 lg제품 존나 광고하네 타이밍뒷.통수한방(1.213) 11.26 41 0
2905002 소프트웨어 엔지니어의 몰입 손발이시립디다갤로그로 이동합니다. 11.26 31 0
2905001 [공식] 누리호 4차 발사 현장 생중계 발명도둑잡기(118.216) 11.26 21 0
2905000 이거 ㅈㄴ 억울한데 항소할지 걍 벌받을지 추천좀 [1] ㅇㅇ(39.7) 11.26 54 0
2904999 슬슬 재취업들어가야겠군 ㅇㅇ(113.59) 11.26 35 0
2904998 R이나 파이썬같은 툴 돌릴 때 작동 원리에 대한 수학 ㅇㅇ(211.108) 11.26 27 0
2904997 음악인 나오는 영화 추천 <꿈의 제인> 발명도둑잡기(118.216) 11.26 27 0
2904994 충격적임.. ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 50 0
2904992 밤하늘 별빛이 호롱불 같구낭 ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 50 0
2904988 Wendy & Lisa-The Closing Of the Year 발명도둑잡기(118.216) 11.26 19 0
2904986 회사에서 AI 써야하는 이유가 있음 박민준갤로그로 이동합니다. 11.26 50 0
2904984 33살 인생 평가좀.. 진지함 정말이야, 절박해 [1] ㅇㅇ(39.7) 11.26 60 0
2904982 [발언대] ‘2인 선거구’ 없애야 민심 제대로 반영된다 발명도둑잡기(118.216) 11.26 20 0
2904981 Ada의 case when 최적화와 errno → 예외 매핑 나르시갤로그로 이동합니다. 11.26 23 0
2904979 무슨 맛으로 먹을까 떡볶이 인데 망했다. [1] 넥도리아(220.74) 11.26 35 0
2904976 통합 에러 핸들러와 이진 탐색 최적화 나르시갤로그로 이동합니다. 11.26 29 0
2904975 나님 주무십니당⭐+ ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 22 0
2904974 Go 쓰자 박민준갤로그로 이동합니다. 11.26 41 0
2904973 악플러 멍유 제발 일본에서 조난.. [4] ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 75 0
2904972 나님 누엇어양✨ ♥냥덩이의우웅한하룽♥갤로그로 이동합니다. 11.26 44 0
2904970 뉴비들을 위한 입시 면접 합격 가이드(따뜻한 조언)!M 프갤러(121.142) 11.26 46 1
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2