?? খালি স্ট্রিং জন্য Coalesce?


165

আমি নিজেকে আরও বেশি কিছু করতে দেখছি এমন কিছু খালি (যেমন শূন্য হিসাবে "") এবং শর্তসাপেক্ষ অপারেটরের জন্য একটি স্ট্রিং পরীক্ষা করছে ।

একটি বর্তমান উদাহরণ:

s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;

এটি কেবলমাত্র একটি এক্সটেনশন পদ্ধতি, এটি এর সমতুল্য:

string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;

যেহেতু এটি খালি এবং নাল ??নয়, কৌশলটি আর করবে না। একটি string.IsNullOrEmpty()সংস্করণ ??নিখুঁত সমাধান হবে। আমি ভাবছি এটি করার একটি পরিষ্কার উপায় থাকতে হবে (আমি আশা করি!) তবে এটি খুঁজে পেতে আমার খুব ক্ষতি হয়েছিল।

কেবল নেট নেট in.০ এ থাকলেও কি কেউ এটি করার আরও ভাল উপায় সম্পর্কে জানেন?


11
কেবল আপনাকে কিছুটা ছড়িয়ে দিতে, আপনি সহজেই এফ # তে কাস্টম, অ্যাডহক বাইনারি (এবং এই বিষয়টির জন্য অকার্যকর) অপারেটরগুলি সংজ্ঞায়িত করতে পারেন। এখানে let (|?) x y = if String.IsNullOrEmpty(x) then y else xএবং এটি পছন্দ মত ব্যবহার করুন s.SiteNumber |? "No Number"
স্টিফেন সোয়েনসেন

উত্তর:


72

এটি করার জন্য কোনও অন্তর্নির্মিত উপায় নেই। আপনি আপনার এক্সটেনশন পদ্ধতির কোনও স্ট্রিং বা নাল ফিরিয়ে আনতে পারেন, তবে এটি কোয়েলসিং অপারেটরকে কাজ করতে দেয়। তবে এটি অদ্ভুত হবে এবং আমি ব্যক্তিগতভাবে আপনার বর্তমান পদ্ধতির পছন্দ করি।

যেহেতু আপনি ইতিমধ্যে একটি এক্সটেনশন পদ্ধতি ব্যবহার করছেন, তাই কেবল মান বা ডিফল্টরূপে কেন তৈরি করবেন না:

string result = s.SiteNumber.ConvertNullOrEmptyTo("No Number");

7
আমি মনে করি আপনি ঠিক বলেছেন, এবং এটি বর্তমানে পাওয়া সহজ সমাধান যা এখনও পঠনযোগ্য। আমি ???সি # 5 তে অপারেটরের মতো কিছু পছন্দ করতাম তবে কে জানে।
নিক Craver

2
এবং কি হবে ??? অপারেটর করবেন? শূন্য ছাড়াও ডিফল্ট মান নিতে?
সেরাভাবে

1
ল্যাম্বডা এক্সপ্রেশন দিয়ে হয়তো? উদাহরণস্বরূপ: ধরে নিন যে "আইটেম "টি অযোগ্য, তারপরে ... item ?? x=> x.ToString() : null;
আইজাক ললোপিস


133

সি # ইতিমধ্যে আমাদের nullসাথে মানগুলির বিকল্প দিতে দেয় ??। সুতরাং আমাদের কেবলমাত্র একটি এক্সটেনশন যা খালি স্ট্রিংকে রূপান্তর করে nullএবং তারপরে আমরা এটি ব্যবহার করি:

s.SiteNumber.NullIfEmpty() ?? "No Number";

সম্প্রসারণ শ্রেণি:

public static class StringExtensions
{
    public static string NullIfEmpty(this string s)
    {
        return string.IsNullOrEmpty(s) ? null : s;
    }
    public static string NullIfWhiteSpace(this string s)
    {
        return string.IsNullOrWhiteSpace(s) ? null : s;
    }
}

44

আমি জানি এটি একটি পুরানো প্রশ্ন - তবে আমি একটি উত্তর খুঁজছিলাম এবং উপরের কোনওটিই আমার প্রয়োজনীয়তার সাথে আমি যা ব্যবহার করে শেষ করেছি তা ফিট করে না:

private static string Coalesce(params string[] strings)
{
    return strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));
}

ব্যবহার:

string result = Coalesce(s.SiteNumber, s.AltSiteNumber, "No Number");

সম্পাদনা: এই ফাংশনটি লেখার আরও একটি কমপ্যাক্ট উপায় হ'ল :

static string Coalesce(params string[] strings) => strings.FirstOrDefault(s => !string.IsNullOrEmpty(s));

1
আমি পছন্দ করি, তবে একটি সংকলক ত্রুটিটি ঠিক করতে হয়েছিল এবং এটিকে কিছুটা আরও কমপ্যাক্ট করে তুলেছিলাম।
গ্রেগম্যাক

আপনি কেন এই কোলেসকে কল করবেন যখন এটি মানগুলি একত্রিত করে না, তবে কেবল খালি নয় এমনটি নির্বাচন করে? এটি একটি বিভ্রান্তিকর নাম বন্ধু
জিমিটি 1988

8
কারণ কোলেসেস একই শব্দটি ব্যবহার করার জন্য অনেক ডাটাবেস দ্বারা ব্যবহৃত শব্দ (প্রথম নন-নাল মানটি সন্ধান করুন)। স্ট্রিংগুলিতে একসাথে যোগ হওয়া সংক্ষেপণ।
ক্যামেরন ফরওয়ার্ড

সেরা উত্তর যদি আপনি হনusing System.Linq
JoePC

এটা মার্জিত, চমৎকার কাজ।
মারিয়ানো লুইস ভিলা

16

আমার কাছে বেশ কয়েকটি ইউটিলিটি এক্সটেনশন রয়েছে যা আমি ব্যবহার করতে চাই:

public static string OrDefault(this string str, string @default = default(string))
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

public static object OrDefault(this string str, object @default)
{
    return string.IsNullOrEmpty(str) ? @default : str;
}

সম্পাদনা: sfsr এর উত্তর দ্বারা অনুপ্রাণিত , আমি এখন থেকে আমার সরঞ্জামবক্সে এই রূপটি যুক্ত করব:

public static string Coalesce(this string str, params string[] strings)
{
    return (new[] {str})
        .Concat(strings)
        .FirstOrDefault(s => !string.IsNullOrEmpty(s));
}

1
আমি অবশ্যই "কোলেসেস" শব্দটি ব্যবহার করছি, কারণ এটি নাল কোলেসিং অপারেটর (??) এর অভিপ্রায়টির সাথে আরও সাদৃশ্যপূর্ণ, যদিও আমি এটিকে "CoalesceTo" হিসাবে পরিবর্তন করেছি।
llaughlin

প্যারামিটারের @উপসর্গটি কী করে @default? আমি এর আগে কখনও দেখিনি।
ড্রু চ্যাপিন

3
@ ড্রুসিফেরে - এটি কেবলমাত্র আপনার defaultপরিবর্তনশীল নাম হিসাবে ব্যবহার করতে দেয় যদিও এটি সি # তে সংরক্ষিত কীওয়ার্ড allows
জাস্টিন মরগান 15

1
@ Jimmyt1988 - এটা মান টি-এসকিউএল পরিমাপক কারণ একসঙ্গে বেড়ে ওঠা ফাংশন।
জাস্টিন মরগান

1
@ জিমিটি ১৯৮৮ - এছাড়াও এটি বিশেষভাবে স্বেচ্ছাসেবী দৈর্ঘ্যের তালিকার প্রথম অ-খালি ফাংশনটি নির্বাচন করে বলে । এটি একটি সূক্ষ্ম বিশদ, কিন্তু টি-এসকিউএল ফাংশন একইভাবে কাজ করে। নামটি ডকুমেন্টেশন সহ বা ছাড়াই এই ফাংশনটি জানেন এমন যে কোনও ব্যক্তির পক্ষে এটি স্বজ্ঞাত করে তোলে।
জাস্টিন মরগান

6

আগে প্রস্তাবিতের চেয়ে কিছুটা দ্রুত এক্সটেনশন পদ্ধতি সম্ভবত:

public static string Fallback(this string @this, string @default = "")
{
    return (@this == null || @this.Trim().Length == 0) ? @default : @this;
}

11
ইসনুলআরওয়েটস্পেসটি কেন ছাঁটাই এবং দৈর্ঘ্যের চেয়ে বেশি ব্যবহার করবেন না ।
ওয়েস্টন

1
codeপাবলিক স্ট্যাটিক স্ট্রিং কোলেসেস (এই স্ট্রিং @ এটি, স্ট্রিং @ ডিফল্ট = "") {রিটার্ন (@ এই == নাল || স্ট্রিং.আইএসনুলআর হোয়াইটস্পেস (@ এই))? @ ডিফল্ট: @ এই; }
পল-2011

6

নাল-কোয়েলসিং অপারেটরের একটি সুবিধা হ'ল এটি শর্ট সার্কিট। প্রথম অংশটি শূন্য না হলে, দ্বিতীয় অংশটি মূল্যায়ন করা হয় না। ফলব্যাকের জন্য ব্যয়বহুল অপারেশন প্রয়োজন হলে এটি কার্যকর হতে পারে।

আমি এখানে দিয়ে শেষ করেছি:

public static string Coalesce(this string s, Func<string> func)
{
    return String.IsNullOrEmpty(s) ? func() : s;
}

ব্যবহার:

string navigationTitle = model?.NavigationTitle.
    Coalesce(() => RemoteTitleLookup(model?.ID)). // Expensive!
    Coalesce(() => model?.DisplayName);

6

আমি কেবল একটি নুলিফেম্পটি এক্সটেনশন পদ্ধতি ব্যবহার করি যা স্ট্রিংটি খালি অনুমতি দিলে সর্বদা নালায় ফিরে আসবে ?? (নাল কোলেসিং অপারেটর) স্বাভাবিক হিসাবে ব্যবহৃত হবে।

public static string NullIfEmpty(this string s)
{
    return s.IsNullOrEmpty() ? null : s;
}

এই তাহলে অনুমতি দেয় ?? সাধারণ হিসাবে ব্যবহার করা যায় এবং চেইনগুলি পড়তে সহজ করে তোলে।

string string1 = string2.NullIfEmpty() ?? string3.NullIfEmpty() ?? string4;

3

স্ট্রিং এক্সটেনশন পদ্ধতি সম্পর্কে কীভাবে

public static string ValueOrDefault(this string s, string sDefault)
{
    if (string.IsNullOrEmpty(s))
        return sDefault;
    return s;
}

বা স্ট্রিং খালি হলে নাল ফেরান:

public static string Value(this string s)
{
    if (string.IsNullOrEmpty(s))
        return null;
    return s;
}

যদিও এই সমাধানগুলি চেষ্টা করে দেখেনি।


2
আমি সেখানে বিকল্প # 1 পছন্দ করি, যদিও আমি এটিকে আর () এর মতো আরও শব্দার্থক কিছু বলি, তাই আমি "স্ট্রিং এস = এস.সাইটি নাম্বার.অর (" ডিফল্ট ") লিখতে পারি;"
jvenema

2
...OrDefault()যদি ফ্রেমের ফ্রেমের অন্যান্য ...OrDefault()পদ্ধতির মতো আচরণ না করে তবে কিছু কল করা বিভ্রান্তিকর হবে । এটি পছন্দ করুন বা না করুন, এমএস সেই নামকরণের একটি নির্দিষ্ট অর্থ দিয়েছে এবং কাস্টম পদ্ধতিতে সেই আচরণ থেকে বিচ্যুত হওয়া আপনার এপিআই এর ব্যবহারকারীদের অহেতুক বিভ্রান্ত করছে।
mattmc3

3

আমি নিজের স্ট্রিং কোলেসেস এক্সটেনশন পদ্ধতিটি ব্যবহার করছি। যেহেতু এখানকার লোকেরা লিনকিউ ব্যবহার করছে, এবং নিবিড়ভাবে সময় নিবিড় ক্রিয়াকলাপগুলির জন্য সম্পদগুলি নষ্ট করছে (আমি এটি আঁট লুপগুলিতে ব্যবহার করছি), তাই আমি আমার ভাগ করে নিই:

public static class StringCoalesceExtension
{
    public static string Coalesce(this string s1, string s2)
    {
        return string.IsNullOrWhiteSpace(s1) ? s2 : s1;
    }
}

আমি মনে করি এটি বেশ সহজ, এবং আপনার এমনকি নাল স্ট্রিংয়ের মানগুলিও বিরক্ত করার প্রয়োজন নেই। এটি এর মতো ব্যবহার করুন:

string s1 = null;
string s2 = "";
string s3 = "loudenvier";
string s = s1.Coalesce(s2.Coalesce(s3));
Assert.AreEqual("loudenvier", s);

আমি এটি অনেক ব্যবহার করি। এই "ইউটিলিটি" ফাংশনগুলির মধ্যে একটি আপনি প্রথমে ব্যবহারের পরে বাঁচতে পারবেন না :-)


আমি মনে করি না আপনি কেন লিনকিউ ব্যবহার করছেন তা আপনি বুঝতে পেরেছেন, এবং যেহেতু কলগুলির আগে প্যারামিটারগুলি মূল্যায়ন করা হয়, s2.Coalesce(s3)প্রয়োজনের পরেও আপনার চালানো হয়। একটি NullIfEmpty()এক্সটেনশন ব্যবহার করা ভাল ??
নেটমেজ

@ নেটমেজ আমি আপনাকে গ্যারান্টি দিতে পারি যে আমি যে উপস্থাপন করেছি তার তুলনায় লিনকুই সংস্করণগুলি অনেক কম পারফরম্যান্ট। আপনি যদি চান তবে এটি পরীক্ষা করার জন্য একটি সাধারণ বেঞ্চমার্ক তৈরি করতে পারেন। আমি বেঞ্চমার্কিং কোড লেখার সময় সাধারণ সমস্যাগুলি রোধ করতে github.com/dotnet/BenchmarkDotNet ব্যবহার করার পরামর্শ দিই
লাউডেনভিয়ার

0

আমি এটির জন্য নিম্নলিখিত এক্সটেনশন পদ্ধতির ব্রুটিটি পছন্দ করি QQQ, যদিও অবশ্যই কোনও অপারেটর পছন্দ করে? ভালো হবে. তবে আমরা কেবল দুটি নয় বরং তিনটি স্ট্রিং বিকল্পের মানকে তুলনা করার অনুমতি দিয়ে এটি আপ করতে পারি, যা এখনি এবং তারপরে হ্যান্ডেল করার প্রয়োজনীয়তার মুখোমুখি হয় (নীচে দ্বিতীয় ক্রিয়াটি দেখুন)।

#region QQ

[DebuggerStepThrough]
public static string QQQ(this string str, string value2)
{
    return (str != null && str.Length > 0)
        ? str
        : value2;
}

[DebuggerStepThrough]
public static string QQQ(this string str, string value2, string value3)
{
    return (str != null && str.Length > 0)
        ? str
        : (value2 != null && value2.Length > 0)
            ? value2
            : value3;
}


// Following is only two QQ, just checks null, but allows more than 1 string unlike ?? can do:

[DebuggerStepThrough]
public static string QQ(this string str, string value2, string value3)
{
    return (str != null)
        ? str
        : (value2 != null)
            ? value2
            : value3;
}

#endregion

আপনি যদি সংক্ষিপ্ত নাম পছন্দ করেন তবে আপনি এটি কল Orকরতে পারেন এবং আমি paramsঅন্যান্য উত্তরগুলির মতো কীওয়ার্ডটি ব্যবহার করব যা একাধিক পরামিতিগুলির জন্য সদৃশ সংজ্ঞা এড়িয়ে চলে।
চিয়েল দশ ব্রিনকে

ধারণার জন্য ধন্যবাদ। আমি দীর্ঘদিন থেকে নিজের নামের সাথে এই নামটি "ফার্স্টনটনল" দিয়ে প্রতিস্থাপন করেছি। অন params, ডিফল্ট দৃশ্যের জন্য দু'টি paramsনা করাটাই ভাল as কারণ আপনার যখন কেবলমাত্র ডিফল্ট এক বা দুটি ইনপুট থাকে কেবল তখনই অ্যারেটি বরাদ্দ দেওয়া হয়। এর পরে বোঝা যায়।
নিকোলাস পিটারসেন 14
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.