क्या C ++ के लिए एक LINQ लाइब्रेरी है? [बन्द है]


82

LINQ को कुछ फैशन में CQ के लिए लाने के लिए क्या कोई प्लेटफॉर्म एग्नोस्टिक (CLI नहीं) मूवमेंट्स हैं?

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


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

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

2
यार, यह वास्तव में मददगार सवाल है! कृपया इन जैसे सवालों को बंद न करें!
1300 बजे j00hi

कृपया मेरे निहितार्थ की जाँच करें github.com/DevUtilsNet/linqcpp मैंने अन्य कार्यान्वयन का विश्लेषण किया और उन सभी खामियों को दूर किया जो मेरे अनुरूप नहीं थीं।
एंटवॉर्ड

जवाबों:


34

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


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

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

21

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

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

अद्यतन: परियोजना https://github.com/k06a/boolinq में स्थानांतरित हो गई और अब स्रोत कोड की केवल 700 लाइनों के साथ संस्करण 2.0 है :)


मैं संकलन त्रुटियों के कारण Qt 5.9.1 के साथ बूलिंक का उपयोग नहीं कर सका Q_FOREACH। संभवत: Q_FOREACHचरणबद्ध होने के कारण ।
निकोला मालेसेविले

@ NikolaMalešević को आप सही ढंग से परिभाषित करने से पहले boolinq.h को शामिल करने का प्रयास कर सकते हैं: #define foreach for_eachउसके बाद शामिल करें: #undef foreachऔर फिर Qt हेडर शामिल करें।
k06a

1
वास्तव में बूलिनक की तरह! कृपया GroupBy जोड़ने
pingu

18

Microsoft ने केवल यह घोषणा की है कि उन्होंने C और C ++ के लिए LINQ का निर्माण किया है। अभी तक उपलब्ध नहीं है, हालांकि।

अपडेट 11/06/2012:

Microsoft Open Technologies, Inc. ने अब LINQ कार्यान्वयन (Ix ++) सहित कई संबंधित लाइब्रेरियों (Apache लाइसेंस 2.0) को रिलीज़ और ओपन-सोर्स (Apache लाइसेंस 2.0) जारी किया है और यह नई रिएक्टिव एक्सटेंशन्स (Rx ++) लाइब्रेरी है।


8

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


7

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


काफी दिलचस्प है, जब मुझे मौका मिले तो इसे देखने के लिए धन्यवाद!
रॉबर्ट गोल्ड

7

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

यह इस तरह कोड लिखने की अनुमति देता है:

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
ब्लाइंडली सी # को C ++ में कनवर्ट करना किसी को भी अच्छा करने वाला नहीं है। आपको इंटरफेस की आवश्यकता क्यों है? यदि आप उन से छुटकारा पा लेते हैं, तो आपको उन सभी बेकार आवंटन और सूचक सिंटैक्स से भी छुटकारा मिल जाता है। और यदि आप नहीं कर सकते, तो कम से कम shared_ptrएस को unique_ptrएस पर स्विच करें , क्योंकि बाद को पूर्व में परिवर्तित किया जा सकता है, लेकिन इसके विपरीत नहीं। इसके अलावा, स्टाइल चीज़, आपको -> doubleरिटर्न प्रकार की आवश्यकता नहीं है । बस अंतर्निहित रूपांतरण को अपना काम करने दें।
Xeo

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

5
एक स्थिर, अभिव्यक्ति टेम्पलेट आधारित दृष्टिकोण जो मेरे मन में था। उस पर पढ़ो।
XIO

धन्यवाद, Xeo, वास्तव में! अभिव्यक्ति टेम्पलेट बहुत दिलचस्प हैं, मैं निश्चित रूप से उनके बारे में अधिक जानने की कोशिश करूंगा। क्या आपको लगता है कि उन्हें LINQ अर्थ (एक समय में एक आइटम "अनुक्रम" के साथ आलसी मूल्यांकन को लागू करने के लिए इस्तेमाल किया जा सकता है?) क्योंकि मुझे लगता है कि यह LINQ का सार है: आप मौजूदा कंटेनरों को संशोधित नहीं करना चाहते हैं, और आप एक बार अस्थायी कंटेनरों के लिए सभी डेटा उत्पन्न नहीं करना चाहते हैं जो एक LINQ अभिव्यक्ति में समाहित सभी ऑपरेटरों के आउटपुट हैं। यह आलसी होना चाहिए, अन्यथा LINQ को परेशान करने की कोई आवश्यकता नहीं है, आप stl, std एल्गोरिदम और लैम्ब्डा के साथ सब कुछ कर सकते हैं।
पाओलो सेवरिन

2
खैर .. सिर्फ एक पुनरावृत्ति के दौरान जो कुछ भी आप चाहते हैं उसे लागू करें। इसके अलावा, Boost.Range पर एक नज़र डालें
Xeo

3

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

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

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);

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


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

3

वास्तव में यदि आप सूची बोध के लिए बस Linq का उपयोग करना चाहते हैं, तो आप इस Linq पुस्तकालय का उपयोग कर सकते हैं । इसके लिए C ++ 11 (यह MSVC 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

2

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


2

यहाँ c ++ 11 (चीनी में) के साथ c ++ - linq का मेरा कार्यान्वयन है:

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

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

यह "से, सेलेक्ट, व्हेयर, कास्ट, रेंज, ऑल, एनी, कास्ट, एवरेज, सम, सम, काउंट, फर्स्ट, हैड, टेल, ग्रुपबी, टेक यूटिल, स्किप यूंटिल, मैक्स, मि, कम, सहित दर्जनों फंक्शन को सपोर्ट करता है।" अद्वितीय, क्रमबद्ध, यादृच्छिक, प्रतिच्छेदन, _यूनियन "।

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


-4

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


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

7
Boost.Phoenix लाइब्रेरी बिना किसी प्री-कंपाइलर ट्रिक के भी Lambdas को C ++ में जोड़ देती है। देखें tinyurl.com/d4y9se सी के साथ, [boost.org] बेशक ++ इस सामान का 0x बहुत आसान हो जाता है! LINQ कैसे करें c ++ 0x tinyurl.com/d9zlsc [blogspot.com]
jk के

3
LOL, बढ़ावा देने में मदद के साथ :: lambda, कुछ टेम्प्लेट चालकता और एक निश्चित मामले में precompiler मैं निम्नलिखित सिंटैक्स के साथ आने में सक्षम था: from(v).where(&_1 ->* &Person::age >= 18).order_by(Person, age).top(5).order_by(Person, name)एक एसटीडी से पांच सबसे कम उम्र के वयस्कों का चयन करने के लिए :: वेक्टर <व्यक्ति> और उन्हें वापस करें वर्णमाला क्रम में। इसलिए मैं कहूंगा कि C ++ टास्क के लिए पर्याप्त है ...
एंड्रियास मैग्यूसन

1
@ और, ओह, मुझे लगा कि आप LINQ को SQL क्वेरी में बदलने के लिए LINQ के सुपरपावर का उपयोग कर रहे हैं। उस स्थिति में आपको एएसटी की आवश्यकता है और इसे सी # के साथ प्राप्त करें। आप C ++ AFAIK में ऐसा नहीं कर सकते।
एलजार लीबोविच

1
@ ऐलज़ार और @Andreas - वास्तव में LINQ के दो फ्लेवर हैं। एक ऐसा जो मैं मानता हूं कि एंड्रियास करता है, और दूसरा जो अभिव्यक्ति पेड़ (पूर्ण एएसटी का एक उपसमूह) का उपयोग करता है जिसे SQL या कुछ अन्य क्वेरी प्रतिनिधित्व बनाने के लिए कोड में पुनर्व्याख्या की जा सकती है। बाद के फॉर्म के बारे में अधिक जानकारी के लिए, Expression<T>सी # प्रलेखन में देखें।
ड्रू नोकें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.