2008-10-24 15 views
69

क्या कुछ प्लेटफ़ॉर्म में LINQ को C++ के लिए जाने के लिए कोई प्लेटफार्म अज्ञेयवादी (सीएलआई नहीं) आंदोलन है?क्या सी ++ के लिए LINQ लाइब्रेरी है?

मेरा मतलब यूनिक्स के स्वादों पर चलने वाले दुनिया भर में सर्वर ढांचे का एक बड़ा हिस्सा है और यूनिक्स पर सी ++ के लिए LINQ तक पहुंच होने से शायद बहुत से लोग खुश होंगे!

+0

क्या आपका मतलब मोनैड (IENumerable <> और विस्तार विधियों का सेट) है? क्या इसका मतलब इसका भाषा पहलू है? क्या आपका मतलब LINQ-to-SQL है? – yfeldblum

+0

वैसे LINQ-SQL भाग वह हिस्सा है जो मैं वास्तव में चाहता हूं, लेकिन यह LINQ की भाषा और monads पर निर्भर करता है। –

उत्तर

-1

मुझे नहीं लगता कि सी ++ में लैम्ब्डा अभिव्यक्तियों जैसी चीजों को संभालने के लिए कंपाइलर चीनी है, इसलिए नहीं, ऐसा नहीं होने वाला है।

+5

सी ++ 0 एक्स में लैम्ब्डा है, इसलिए यह सैद्धांतिक रूप से संभव होना चाहिए, लेकिन हाँ यह एक आसान काम नहीं है। –

+0

अब आपने इसका उल्लेख किया है और मुझे सोचने के लिए, एक और विकल्प मैं कल्पना कर सकता हूं कि क्यूटी रूट जाना है, और सी ++ में सिंटैक्टिक चीनी जोड़ने के लिए प्री-कंपाइलर का उपयोग करना है, यह एक अच्छा विकल्प हो सकता है –

+7

बूस्ट। फीनिक्स लाइब्रेरी किसी भी पूर्व-कंपाइलर चाल के बिना Lambdas को C++ में जोड़ता है। Http://tinyurl.com/d4y9se देखें [boost.org] बेशक, सी ++ 0x के साथ इस सामान का बहुत आसान हो जाता है! एक अच्छा आलेख सी ++ 0x http://tinyurl.com/d9zlsc [blogspot.com] –

2

सी ++ 0x, या जो भी इसे समाप्त होता है, उसके पास auto नामक एक नया कीवर्ड है जो टाइप-इनफरेंस की अनुमति देता है। और हाँ, लैम्ब्डा सी ++ के लिए आ जाएगा। इसके अलावा, एक त्वरित Google खोज ने यह खुलासा किया, CLinq

7

आप PSade.Oven पर देख सकते हैं, जो एसटीएल श्रेणियों पर काम कर रहे एक मजबूत बूस्ट लाइब्रेरी और कार्यों की तरह बहुत LINQ प्रदान करते हैं।

+0

काफी रोचक, मुझे एक मौका मिलने पर मुझे एक मौका मिलेगा, धन्यवाद! –

32

Linq++ हांग जियांग द्वारा अच्छी शुरुआत की तरह दिखता है। इसका वाक्यविन्यास CLinq की तुलना में लिंक के करीब है। Pfultz2 द्वारा Linq दिलचस्प लग रहा है, लेकिन इसके साथ ही इसे एक C++ 11 कंपाइलर की आवश्यकता है।

+1

बहुत दिलचस्प काम –

+1

अच्छा। सी ++ 11 संस्करण बहुत दिलचस्प लगता है, भले ही उसकी कच्ची समझ के उदाहरण को "बॉयलरप्लेट कोड" से बचने के लिए फीनिक्स का उपयोग करना चाहिए था। – KitsuneYMG

+0

हम्म मैं उन्हें SQL डेटाबेस का समर्थन नहीं देख रहा हूं। – Arne

12

यह टेम्पलेट सी ++ LINQ लाइब्रेरी का मेरा समाधान है।
स्रोत कोड यहां है: Boolinq
प्रत्येक सुविधा पर बहुत सारे परीक्षण हैं।
मैं अभी इस पर काम कर रहा हूं।

कोई टिप्पणी?
सलाह हो सकती है?

अद्यतन: परियोजना https://github.com/k06a/boolinq चले गए और अब स्रोत कोड के केवल 700 लाइनों :)

+0

मैं Q_FOREACH' के संबंध में त्रुटियों को संकलित करने के कारण Qt 5.9.1 के साथ boolinq का उपयोग नहीं कर सका। शायद 'Q_FOREACH' चरणबद्ध होने के कारण। '#define foreach for_each' तो शामिल करने के बाद:' #undef foreach' और फिर क्यूटी हेडर शामिल हैं –

+0

@ NikolaMalešević आप boolinq.h शामिल ठीक पहले परिभाषित कर सकते हैं। – k06a

7

मैं एक छोटा सा पुस्तकालय cppLinq कि reimplements IEnumerable < लिखा है> और उसके LINQ ऑपरेटरों के साथ संस्करण 2.0 है। यह सिर्फ एक प्रयोग है; अभी के लिए यह केवल विंडोज पर काम करता है (coroutines Win32 फाइबर के साथ कार्यान्वित किया जाता है), और केवल वीएस 11 के देव पूर्वावलोकन के साथ बनाता है (यह लैम्ब्डा अभिव्यक्तियों का भारी उपयोग करता है :-))। वास्तव में तुम सिर्फ सूची समझ के लिए Linq उपयोग करना चाहते हैं, तो आप इस Linq पुस्तकालय का उपयोग कर सकते

auto source = IEnumerable<int>::Range(0, 10); 

auto it = source->Where([](int val) { return ((val % 2) == 0); }) 
       ->Select<double>([](int val) -> double { return (val * val); })); 

foreach<double>(it, [](double& val){ 
    printf("%.2f\n", val); 
}); 
+7

अंधेरे से कनवर्ट करना सी # से सी ++ किसी को भी अच्छा नहीं करने वाला है। आपको इंटरफेस की आवश्यकता क्यों है? यदि आप उनसे छुटकारा पा लेते हैं, तो आप उन सभी बेकार आवंटन और पॉइंटर सिंटैक्स से छुटकारा पा सकते हैं। और यदि आप नहीं कर सकते हैं, कम से कम 'shared_ptr' से 'unique_ptr 'पर स्विच करें, क्योंकि बाद वाले को पूर्व में परिवर्तित किया जा सकता है, लेकिन इसके विपरीत नहीं। इसके अलावा, शैली की चीज़, आपको '-> डबल' रिटर्न प्रकार की आवश्यकता नहीं है। बस निहित रूपांतरणों को अपना काम करने दें। – Xeo

+2

आपकी टिप्पणी के लिए धन्यवाद। हां, उपरोक्त नमूने में लैम्ब्डा थोड़ा सुधार किया जा सकता है, लेकिन यह सिर्फ एक विवरण है। मुझे यकीन नहीं है कि मैं साझा_ptrs और पॉइंटर्स के बारे में क्या कर सकता हूं, हालांकि। विचार आलसी मूल्यांकन और डेटा पाइपलाइन प्रदान करने के लिए, सीओटीन में इरेटरेटर ब्लॉक को कार्यान्वित करना था, ठीक उसी तरह सी # में कैसे लागू किया गया था। स्रोत हम कुछ है कि एक एसटीएल कंटेनर से "उत्पन्न" डेटा, उदाहरण के लिए हो सकता है, लेकिन फिर हम घटक है कि IEnumerators की तरह व्यवहार करना चाहिए की एक पाइप है, सह दिनचर्या से डेटा प्राप्त होता है। LINQ के C++ संस्करण के लिए आपके पास क्या इंटरफेस होगा? –

+5

एक स्थैतिक, अभिव्यक्ति टेम्पलेट आधारित दृष्टिकोण मेरे मन में था। [यह पढ़ें।] (Http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Expression-template) – Xeo

3

:

यह इस तरह कोड लिखने की अनुमति देता है। इसके लिए सी ++ 11 की आवश्यकता है (हालांकि यह एमएसवीसी 2010 में काम करेगा) और बूस्ट। पुस्तकालय के साथ आप इस तरह LINQ प्रश्नों लिख सकते हैं:

struct student_t 
{ 
    std::string last_name; 
    std::vector<int> scores; 
}; 

std::vector<student_t> students = 
{ 
    {"Omelchenko", {97, 72, 81, 60}}, 
    {"O'Donnell", {75, 84, 91, 39}}, 
    {"Mortensen", {88, 94, 65, 85}}, 
    {"Garcia", {97, 89, 85, 82}}, 
    {"Beebe", {35, 72, 91, 70}} 
}; 

auto scores = LINQ(from(student, students) 
        from(score, student.scores) 
        where(score > 90) 
        select(std::make_pair(student.last_name, score))); 

for (auto x : scores) 
{ 
    printf("%s score: %i\n", x.first.c_str(), x.second); 
} 

कौन सा होगा उत्पादन:

Omelchenko score: 97 
O'Donnell score: 91 
Mortensen score: 94 
Garcia score: 97 
Beebe score: 91 
17

माइक्रोसॉफ्ट just announced कि वे C और C++ के लिए LINQ का निर्माण किया है है। हालांकि, अभी तक उपलब्ध नहीं है।

अपडेट 11/06/2012:

माइक्रोसॉफ्ट ओपन टेक्नोलॉजीज, इंक अब released और open-sourced (अपाचे लाइसेंस 2.0) एक LINQ कार्यान्वयन (Ix ++) सहित संबंधित पुस्तकालयों, की एक संख्या है, और यह नया क्या है प्रतिक्रियाशील एक्सटेंशन (आरएक्स ++) पुस्तकालय।

2

यहां एक और alternative है जो कि बूस्ट और एसएलएल एल्गोरिदम के आसपास एक रैपर है, और इस प्रकार आप उन कार्यान्वयन के अधिकांश प्रदर्शन लाभ प्राप्त करते हैं।

यह इस तरह काम करता है:

std::vector<int> xs; 
auto count = from(xs) 
    .select([](int x){return x*x;}) 
    .where([](int x){return x > 16;}) 
    .count(); 
auto xs2 = from(xs) 
    .select([](int x){return x*x;}) 
    .to<std::vector<int>>(); 

ध्यान दें कि कुछ तरीकों खाली पर्वतमाला, उदा के लिए एक प्रॉक्सी वापसी

std::vector<int> xs; 
auto max = from(xs) 
    .select([](int x){return x*x;}) 
    .where([](int x){return x > 16;}) 
    .max() 
    .value_or(default_max_value); 

प्रतिक्रिया का स्वागत है।

+0

बहुत अच्छी तरह से किया, मुझे यह पसंद है। –

2

यहाँ ग के ++ मेरी अंतर्गत प्रयोग किया है - C++ 11 के साथ LINQ (चीनी में):

http://www.cnblogs.com/cbscan/archive/2012/10/20/2732773.html

यह "आस्थगित क्वेरी", "आधारित ढेर" (उपयोग ऑपरेटर थोड़ा के रूप में नए जैसी सुविधाओं का समर्थन जितना संभव हो), "अर्थात् प्रतिलिपि बनाएँ" (ताकि आप बैकअप के बाद एक क्वेरी बहुतायत को पुन: सक्रिय कर सकें), और इसी तरह।

यह भी से चयन करें, जहां, कलाकारों, रेंज, सभी, किसी भी, कलाकारों, औसत, होते हैं, गिनती, प्रथम, अंतिम, सिर, पूंछ, GroupBy, takeUntil, skipUntil, अधिकतम सहित समारोह के दर्जनों का समर्थन ", मिनट, कम, अद्वितीय, क्रमबद्ध, यादृच्छिक, छेड़छाड़, _union "।

मुझे लगता है कि मेरा कोड किसी भी व्यक्ति द्वारा समझने और विस्तार करने के लिए पर्याप्त सरल है।

9

http://cpplinq.codeplex.com/ एक बहुत अच्छा कार्यान्वयन है।
लेखक से:
सीपीपीलिन के लिए प्रेरणा यह है कि बूलिनक और मूल-आरएक्स दोनों ऑपरेटर के आस-पास स्थित हैं। " सूची कार्यों को लिखने के लिए। समस्या यह है कि "।" ऑपरेटर यह है कि इसे सी ++ में ओवरलोड नहीं किया जा सकता है जो इन पुस्तकालयों को अपने स्वयं के डिज़ाइन के कार्यों के साथ विस्तारित करना मुश्किल बनाता है। मेरे लिए यह महत्वपूर्ण है। CppLinq ऑपरेटर के चारों ओर आधारित है >> जो ओवरलोड करने योग्य है इस प्रकार CppLinq को एक्स्टेंसिबल बनाया जा सकता है।

संबंधित मुद्दे