क्या कोई # एल्गोरिदम में एकवचन है - एक शब्द का बहुवचन?


106

क्या कोई # एल्गोरिथ्म में c # को एकवचन करने के लिए है - एक शब्द (अंग्रेजी में) का बहुवचन करें या ऐसा करने के लिए एक .net लाइब्रेरी मौजूद है (विभिन्न भाषाओं में भी हो सकती है)?

जवाबों:


182

आपके पास System.Data.Entity.Design.PluralizationServices.PluralizationService भी है ।

अद्यतन : पुराना उत्तर अद्यतन का हकदार है। अब मानवतावादी भी है: https://github.com/MehdiK/Humanizer


2
हममम आप पुनर्वितरित करने की अनुमति देते हैं, या बस उपयोग करें, एक डिज़ाइन डीएलएल? मैं पूछता हूं कि क्योंकि मुझे पता है कि DevExpress के लिए लाइसेंस किसी भी .design DLL के पुनर्वितरण को प्रतिबंधित करता है।
पियरे-एलेन विगेंट

58
ILSpy के साथ कोड खोलने से एक वर्ग दिखाई देता है, जिसका नाम है EnglishPluralizationService, जिसमें बहुत सारे असाधारण मामले हैं, जो दिलचस्प तरीके से परिभाषित किए गए हैं और पढ़ने के लायक बनाते हैं। मुझे विशेष रूप से 'न्यूमोनोल्मेट्राम्रोस्कोपिक्सिलिकोवलकोनियोकोसिस' पसंद है, जिसे मैं अपनी इकाई मॉडल में हर समय उपयोग कर पाता हूं ...
8o

7
मैं अनुमान लगा सकता हूं कि कैसे जोड़ा गया। एक परीक्षक ने देव पर यह कहते हुए बग दर्ज किया कि यह उक्त शब्द के लिए काम नहीं करता है। देव ने इसे ठीक कर दिया। दोनों ने एक हंसी साझा की।
मर्लिनबियर


1
मानवीकरण एक महान सिफारिश है। मैं निश्चित रूप से इसे लागू करने से पहले 15% की तरह इसे लागू करने का पता लगाता हूँ।
केसी

18

मैं इसे एस्पेरांतो के लिए कर सकता हूँ, कोई विशेष मामले नहीं!

string plural(string noun) { return noun + "j"; }

अंग्रेजी के लिए, नॉन के रेगुलर प्लुरल्स के साथ-साथ नॉन के अनियमित प्लुरल के नियमों से परिचित होना उपयोगी होगा । अंग्रेजी बहुवचन पर एक संपूर्ण विकिपीडिया लेख है , जिसमें कुछ उपयोगी जानकारी भी हो सकती है।


5
यदि आप क्रिया या क्रिया विशेषण में गुजरते हैं तो आपको इसे फेंक देना चाहिए!
तिमवी

1
@ मैट: बेशक यह नाममात्र के मामले के लिए उपयुक्त है; मुझे विश्वास है कि इस मामले को दोषपूर्ण मामले तक पहुंचाना एक सीधा पाठक के लिए सीधा है।
ग्रेग हेविगेल

14

अधिकांश ORM के पास एक छुरा होता है, हालांकि वे आम तौर पर परिपूर्ण नहीं होते हैं। मुझे पता है कि कैसल में यह इंफ़्लेक्टर क्लास है जो आप शायद चारों ओर प्रहार कर सकते हैं यह "पूरी तरह से" करना एक आसान काम नहीं है, हालांकि (अंग्रेजी "नियम" वास्तव में नियम नहीं हैं :)), इसलिए यह निर्भर करता है कि क्या आप "उचित अनुमान" दृष्टिकोण से खुश हैं।


आपके सुझाव से मैंने "Inflector" की खोज की और यह andrewpeters.net/inflectornet पाया कि मूल रूप से बोया जाने वाला महल कैसल का एक ही है
Ronnie

4
वास्तव में यह मूल रूप से समान नहीं है, इसके समान है।
डेविड फेफर

12

मैंने जावा में धोखा दिया - मैं "कुछ कुछ थे (एन) के लिए एक सही स्ट्रिंग का उत्पादन करने में सक्षम होना चाहता था, इसलिए मैंने फोल लिखा। थोड़ा अतिभारित उपयोगिता विधि:

static public String pluralize(int val, String sng) {
    return pluralize(val,sng,(sng+"s"));
    }

static public String pluralize(int val, String sng, String plu) {
    return (val+" "+(val==1 ? sng : plu)); 
    }

जैसे आह्वान किया

System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));

यह केवल व्याकरण के एक छोटे से हिस्से को कवर करता है, हालांकि, यह क्विज़, पार्टी, हल, चूहों, सूचकांकों जैसे शब्दों के लिए खाता नहीं है, आदि यह एक अच्छा पहला छुरा है, लेकिन बहुत सारे अन्य नियम हैं जिन्हें संभवतः पहले संसाधित किया जाना चाहिए। ।
जेरेमी एस

4
@ जेरेमी: क्यों नहीं ?: प्रिंट्लन ("आप पास हो गए" + एकवचनपरिभाष्य (गिनती, "प्रश्नोत्तरी", "क्विज़") + "अभी तक")
लॉरेंस डोल

मैं इस प्रश्न की अलग तरह से व्याख्या कर सकता हूं। मुझे लगता है कि एल्गोरिथ्म डेवलपर से किसी संकेत के बिना बहुवचन रूप को निर्धारित करना चाहिए, जबकि आपकी विधि यह जानने का प्रयास करती है कि डेवलपर पर बहुवचन रूप क्या है।
जेरेमी एस

3
@ जेरेमी: इसलिए "आई चीट ..." लीड - इन डाउनवोट वारंट नहीं लगता है।
लॉरेंस Dol

1
माना। मुझे यह भी लगता है कि प्रदान की गई जानकारी उपयोगी थी, यही वजह है कि कोई भी डाउनवोट मेरे पास नहीं आया। मैं सामान्य रूप से "एक आदमी के कबाड़ ..." की तर्ज पर नीचे नहीं उतरता।
जेरेमी एस

10

मैंने इसके लिए .net (C #) में एक छोटी सी लाइब्रेरी बनाई है, जिसे Pluralizer (अनिश्चित रूप से) कहा जाता है।

यह पूर्ण वाक्यों के साथ काम करने के लिए है, String.Format की तरह कुछ।

यह मूल रूप से इस तरह काम करता है:

var target = new Pluralizer();
var str = "There {is} {_} {person}.";

var single = target.Pluralize(str, 1);
Assert.AreEqual("There is 1 person.", single);

// Or use the singleton if you're feeling dirty:
var several = Pluralizer.Instance.Pluralize(str, 47);
Assert.AreEqual("There are 47 people.", several);

यह इससे ज्यादा भी कर सकता है। मेरे ब्लॉग पर इसके बारे में और पढ़ें । यह NuGet में भी उपलब्ध है।



4
हाँ, वह पुस्तकालय केवल एकल शब्द करता है, और केवल संज्ञाएं (हालांकि बहुवचन आंतरिक रूप से उस वर्ग का उपयोग करता है)। यह लाइब्रेरी पूरे वाक्यों को लिखने में आसान बनाती है। अधिक उदाहरणों के लिए मेरे ब्लॉग पर एक नज़र डालें। बहुवचन। Instance.Pluralize ("{She} {is to going to {her। | Their related} {home}", 5)
Jay Querido

शॉन विल्सन - मेरा कंप्यूटर वर्तमान में भागों में है। मैं इसे वापस लाने के लिए दौड़ रहा हूं और एक-दो दिन में अपडेट कर दूंगा। इस समय के दौरान, nuget.org/packages?q=pluralizer
Jay Querido

8

मैं एक साथ रेल pluralizer के आधार पर मार पड़ी है। आप मेरे ब्लॉग पोस्ट यहाँ , या यहाँ github पर देख सकते हैं

output = Formatting.Pluralization(100, "sausage"); 

3
साझा करने के लिए धन्यवाद। खुशी है कि मुझे दूसरी विधानसभा का संदर्भ देने की आवश्यकता नहीं थी।
होफनरविले

1
सरल और सुंदर !, लेकिन यह याद करते हैं Singularize कार्यक्षमता
AMD

5

जैसा कि प्रश्न सी # के लिए था, यहां सॉफ्टवेयर मंकी के समाधान पर एक अच्छा बदलाव है (फिर से "धोखा" का एक सा, लेकिन मेरे लिए वास्तव में ऐसा करने का सबसे व्यावहारिक और पुन: प्रयोज्य तरीका है):

    public static string Pluralize(this string singularForm, int howMany)
    {
        return singularForm.Pluralize(howMany, singularForm + "s");
    }

    public static string Pluralize(this string singularForm, int howMany, string pluralForm)
    {
        return howMany == 1 ? singularForm : pluralForm;
    }

उपयोग इस प्रकार है:

"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"

"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"

3

सबसोनिक 3 में एक Inflectorवर्ग है जिसने मुझे बदल PersonदियाPeople । मैंने स्रोत को देखा और पाया कि यह स्वाभाविक रूप से हार्डकोड सूची के साथ थोड़ा धोखा देता है लेकिन यह वास्तव में अंग्रेजी में इसे करने का एकमात्र तरीका है और मनुष्य इसे कैसे करते हैं - हम प्रत्येक शब्द के एकवचन और बहुवचन को याद करते हैं और केवल एक नियम लागू नहीं करते हैं । जैसा कि मिश्रण में जोड़ने के लिए मर्दाना / स्त्री (/ तटस्थ) नहीं है, यह बहुत सरल है।

यहाँ एक स्निपेट है:

AddSingularRule("^(ox)en", "$1");
AddSingularRule("(vert|ind)ices$", "$1ex");
AddSingularRule("(matr)ices$", "$1ix");
AddSingularRule("(quiz)zes$", "$1");

AddIrregularRule("person", "people");
AddIrregularRule("man", "men");
AddIrregularRule("child", "children");
AddIrregularRule("sex", "sexes");
AddIrregularRule("tax", "taxes");
AddIrregularRule("move", "moves");

AddUnknownCountRule("equipment");

यह कुछ शब्दों के लिए बहुवचन समतुल्य नहीं है, जैसे उपकरण उदाहरण। जैसा कि आप शायद बता सकते हैं कि यह Regex$ 1 का उपयोग करके एक सरल प्रतिस्थापन करता है ।

अपडेट:
ऐसा प्रतीत होता है कि सबसोनिक Inflectorहै कैसल एक्टिवरकार्डInflector वर्ग को संक्रमित कर रहा है !


2

PlurizationService वर्ग के विशिष्ट उपयोग पर MSDN से अधिक दस्तावेज़ीकरण नहीं है, इसलिए यहां मूल उपयोग दिखाने के लिए एक इकाई परीक्षण वर्ग (NUnit) है। गैर-बहुवचन बहुवचन रूपों की बात आती है, तो निचले स्तर पर अजीब परीक्षण के मामले को देखें जो सेवा को सही नहीं दिखाता है।

[TestFixture]
public class PluralizationServiceTests
{
    [Test]
    public void Test01()
    {
        var service = PluralizationService.CreateService(CultureInfo.CurrentCulture);

        Assert.AreEqual("tigers", service.Pluralize("tiger"));
        Assert.AreEqual("processes", service.Pluralize("process"));
        Assert.AreEqual("fungi", service.Pluralize("fungus"));

        Assert.AreNotEqual("syllabi", service.Pluralize("syllabus")); // wrong pluralization
    }
}


1

Microsoft के नॉर्थविंड उदाहरण डेटाबेस का उपयोग करना:

 System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));

Singularize, "Order_Details" को Singularize नहीं करता है s, यह अंत में "Order_Details" देता है । चारों ओर काम क्या है?


1
यह एक सवाल है, एक सवाल का जवाब नहीं है ... लेकिन बहुवचन () और एकवचन () केवल शब्दकोश शब्दों के साथ काम करते हैं। ICustomPluralizationMapping.AddWord का उपयोग करते हुए शब्दों को जोड़ने का एक तरीका है, लेकिन कम से कम मेरे लिए जब कोड नामों जैसे बहुत सारे वास्तविक शब्द नहीं हो सकते हैं तो यह बहुत अच्छा समाधान नहीं था।
टोरडल

@tordal धन्यवाद, यह वही है जो मैं इस प्रश्न के लिए आया था
चाड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.