স্ট্রিং যদি ব্যতিক্রম ছুঁড়ে না ফেলে গাইড হয় তবে পরীক্ষা করুন?


180

আমি স্ট্রিংকে একটি গাইডে রূপান্তর করতে চেষ্টা করতে চাই, তবে আমি ব্যতিক্রমগুলি ধরার উপর নির্ভর করতে চাই না (

  • কর্মক্ষমতা কারণে - ব্যতিক্রম ব্যয়বহুল
  • ব্যবহারের কারণে - ডিবাগার পপ আপ
  • ডিজাইন কারণে - প্রত্যাশিত ব্যতিক্রমী নয়

অন্য কথায় কোড:

public static Boolean TryStrToGuid(String s, out Guid value)
{
    try
    {
        value = new Guid(s);
        return true;
    }
    catch (FormatException)
    {
        value = Guid.Empty;
        return false;
    }
}

উপযুক্ত নয়.

আমি RegEx ব্যবহার করার চেষ্টা করব, তবে গাইড যেহেতু প্রথম বন্ধনী আবৃত হতে পারে, ব্রেস মোড়ানো, কোনও মোড়ানো নয়, এটি শক্ত করে তোলে।

অতিরিক্ত হিসাবে, আমি ভেবেছিলাম যে কয়েকটি গাইডের মানগুলি অবৈধ (?)


আপডেট 1

খ্রিস্টানকেFormatException সবার চেয়ে কেবল ধরা ভাল ধারণা ছিল । পরামর্শ অন্তর্ভুক্ত করতে প্রশ্নের কোড নমুনা পরিবর্তন করেছে।


আপডেট 2

কেন ছোঁড়া ব্যতিক্রম সম্পর্কে উদ্বেগ? আমি কি আসলেই প্রায়শই অবৈধ জিইউইডিগুলি আশা করি?

উত্তর হ্যাঁ । এজন্য আমি ট্রাইস্টারটোগুইড ব্যবহার করছি - আমি খারাপ ডেটা প্রত্যাশা করছি

উদাহরণ 1 নামের স্থান এক্সটেনশানগুলি ফোল্ডারের নামের সাথে একটি জিইউআইডি যুক্ত করে নির্দিষ্ট করা যেতে পারে । আমি ফোল্ডারের নামগুলি পার্স করছিলাম, ফাইনালের পরে পাঠ্য কিনা তা পরীক্ষা করে দেখছি একটি নির্দেশিকা।

c:\Program Files
c:\Program Files.old
c:\Users
c:\Users.old
c:\UserManager.{CE7F5AA5-6832-43FE-BAE1-80D14CD8F666}
c:\Windows
c:\Windows.old

উদাহরণ 2 আমি সম্ভবত একটি ভারী ব্যবহৃত ওয়েব-সার্ভার চালিয়ে যাচ্ছি কিছু পোস্ট ব্যাক ডেটার বৈধতা পরীক্ষা করতে চাই। আমি চাই না যে অবৈধ ডেটাগুলি সংস্থানগুলি 2-3 মাপের বাড়ির ক্রমগুলি আবশ্যক তার চেয়ে বেশি হওয়া উচিত।

উদাহরণ 3 আমি কোনও ব্যবহারকারীর দ্বারা প্রবেশ করা একটি অনুসন্ধানের এক্সপ্রেশনকে পার্স করছিলাম।

এখানে চিত্র বর্ণনা লিখুন

যদি তারা জিইউইডি'র প্রবেশ করে তবে আমি তাদের বিশেষভাবে প্রক্রিয়া করতে চাই (যেমন নির্দিষ্টভাবে সেই বস্তুর সন্ধান করা, বা প্রতিক্রিয়া পাঠ্যে সেই নির্দিষ্ট সন্ধানের শব্দটি হাইলাইট এবং বিন্যাস করুন।)


আপডেট 3 - পারফরম্যান্স মানদণ্ড

10,000 টি ভাল গাইড এবং 10,000 টি খারাপ গাইড রূপান্তর করার পরীক্ষা করুন।

Catch FormatException:
   10,000 good:     63,668 ticks
   10,000 bad:   6,435,609 ticks

Regex Pre-Screen with try-catch:
   10,000 good:    637,633 ticks
   10,000 bad:     717,894 ticks

COM Interop CLSIDFromString
   10,000 good:    126,120 ticks
   10,000 bad:      23,134 ticks

PS আমি একটি প্রশ্নের ন্যায়সঙ্গত করা উচিত নয়।


7
কেন বিশ্বের এই সম্প্রদায় উইকি?
জেফ

36
তুমি ঠিক বলছো; আপনার একটি প্রশ্নের ন্যায়সঙ্গত হওয়া উচিত নয় । যাইহোক, আমি আগ্রহের সাথে ন্যায়সঙ্গতটি পড়ি (কারণ এটি এখানে আমি কেন পড়ছি এটির সাথে এটি খুব মিল)। সুতরাং, মহান ন্যায়সঙ্গতের জন্য ধন্যবাদ।
bw

2
@ জেফ সম্ভবত 10 বারেরও বেশিবার এপিটি সম্পাদনা করেছেন - সম্প্রদায় উইকিতে মেটা
মেরিজন

3
গাইডের সাথে সমাধানের জন্য দয়া করে এই পৃষ্ঠাটি দেখতে থাকুন ry ট্রাইপার্স বা গাইড T ট্রাইপার্সেক্স্যাক্ট। নেট 4.0 + এর সাথে উপরের সমাধানটি সবচেয়ে মার্জিত নয়
dplante

1
@dplante আমি ২০০৮ সালে মূলত প্রশ্নটি জিজ্ঞাসা করলে, সেখানে কিছুই ছিল না 4.0। যে কারণে প্রশ্ন, এবং স্বীকৃত উত্তরগুলি হ'ল তারা।
ইয়ান বয়ড

উত্তর:


107

পারফরম্যান্স বেঞ্চমার্ক

Catch exception:
   10,000 good:    63,668 ticks
   10,000 bad:  6,435,609 ticks

Regex Pre-Screen:
   10,000 good:   637,633 ticks
   10,000 bad:    717,894 ticks

COM Interop CLSIDFromString
   10,000 good:   126,120 ticks
   10,000 bad:     23,134 ticks

সিএম ইন্টারফেস (দ্রুততম) উত্তর:

/// <summary>
/// Attempts to convert a string to a guid.
/// </summary>
/// <param name="s">The string to try to convert</param>
/// <param name="value">Upon return will contain the Guid</param>
/// <returns>Returns true if successful, otherwise false</returns>
public static Boolean TryStrToGuid(String s, out Guid value)
{
   //ClsidFromString returns the empty guid for null strings   
   if ((s == null) || (s == ""))   
   {      
      value = Guid.Empty;      
      return false;   
   }

   int hresult = PInvoke.ObjBase.CLSIDFromString(s, out value);
   if (hresult >= 0)
   {
      return true;
   }
   else
   {
      value = Guid.Empty;
      return false;
   }
}


namespace PInvoke
{
    class ObjBase
    {
        /// <summary>
        /// This function converts a string generated by the StringFromCLSID function back into the original class identifier.
        /// </summary>
        /// <param name="sz">String that represents the class identifier</param>
        /// <param name="clsid">On return will contain the class identifier</param>
        /// <returns>
        /// Positive or zero if class identifier was obtained successfully
        /// Negative if the call failed
        /// </returns>
        [DllImport("ole32.dll", CharSet = CharSet.Unicode, ExactSpelling = true, PreserveSig = true)]
        public static extern int CLSIDFromString(string sz, out Guid clsid);
    }
}

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

আপনার যদি স্ট্রিং প্রতিনিধিত্বের কোনও গাইডকে একটি গাইডে রূপান্তর করতে হয় তবে ব্যবহার করুন

new Guid(someString);

8
আপনি এটি ডিবাগার দিয়ে চালিয়েছেন বা বন্ধ করেছেন? ব্যতিক্রম ছোঁড়ার কার্যকারিতাটি ডিবাগারটি সংযুক্ত না করে কয়েকগুণ করে উন্নত করা হয়।
ড্যানিয়েল টি।

ধন্যবাদ. আমি নিজেই এই প্রশ্নটি জিজ্ঞাসা করতে চলেছিলাম। আমি আপনার উত্তর খুঁজে পেয়েছি খুশি।
ডেভিড

আমি উপরে থেকে নাম স্পেস পিএনভোক কোড স্নিপেট সহ একটি পিনভোক.ক.স. নামে একটি নতুন ফাইল তৈরি করেছি, তবে আমি কোডটি কাজ করতে পারি না। আমি যখন ডিবাগ করি তখন দেখি যে সিএলএসআইডিফ্রমস্ট্রিংয়ের ফলাফল সর্বদা নেতিবাচক। আমি কলিং লাইনটি এতে পরিবর্তন করার চেষ্টা করেছি: int hresult = PInvoke.ObjBase.CLSIDFromString (Guid.NewGuid ()। ToString (), আউট মান); তবে এটি এখনও সর্বদা নেতিবাচক থাকে। আমি কি ভুল করছি?
জালার্ড

88

একবার। নেট 4.0 পাওয়া গেলে আপনি ব্যবহার করতে পারেন Guid.TryParse()


8
একটি আরও দ্রুততর উপায় হ'ল গাইড T ট্রাইপার্সেক্স্যাক্ট () পদ্ধতি ব্যবহার করে।

4
যদি গাইড স্ট্রিংগুলি পার্সিং করা আপনার অ্যাপ্লিকেশনটির সবচেয়ে ধীরতম অংশ হয় তবে আপনি ধন্য হন।
কোনও রিফান্ড নেই কোনও রিটার্নস

65

আপনি এটি পছন্দ করতে যাচ্ছেন না তবে আপনাকে কী মনে হয় যে ব্যতিক্রম ধরা ধীর হতে চলেছে?

কোনও জিইউইডি পার্স করার কতটি ব্যর্থ প্রচেষ্টা আপনি সফলদের সাথে তুলনা করে প্রত্যাশা করছেন?

আমার পরামর্শটি আপনার সবেমাত্র তৈরি করা ফাংশনটি ব্যবহার এবং আপনার কোডটি প্রোফাইল করা। যদি আপনি দেখতে পান যে এই ফাংশনটি সত্যই হটস্পট তবে এটি ঠিক করুন তবে আগে নয়।


2
উত্তম উত্তর, অকালীন অপটিমাইজেশন হ'ল সমস্ত অশুভের মূল।
কেভ

33
ব্যতিক্রমী নয় এমন ব্যাতিক্রমের উপর নির্ভর করা এটি দুর্বল ফর্ম। এটি একটি খারাপ অভ্যাস যা আমি চাই না যে কেউ intoুকুক। এবং আমি বিশেষত এটি একটি লাইব্রেরির রুটিনে করতে চাই না যেখানে লোকেরা বিশ্বাস করবে যে এটি কার্যকর এবং ভাল।
ইয়ান বয়ড

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

6
এক্সেসপশনাল কেসগুলির অর্থ ব্যতিক্রম ব্যতিক্রম ব্যবহার করা উচিত: বিকাশকারী দ্বারা পরিচালিত নয়। আমি ত্রুটিগুলি পরিচালনা করার মাইক্রোসফ্টের 'সমস্ত ব্যতিক্রম' এর বিরোধী। রক্ষণাত্মক প্রোগ্রামিং বিধি। মাইক্রোসফ্ট কাঠামো বিকাশকারীদের, গাইড শ্রেণিতে একটি 'ট্রাই পার্সে' যুক্ত বিবেচনা করুন।
মোস

14
আমার নিজের মন্তব্যের প্রতিক্রিয়ায় => Guid.TryParse ফ্রেমওয়ার্ক 4.0 যোগ করা হয়েছে --- msdn.microsoft.com/en-us/library/... --- এই ধরনের একটি দ্রুত প্রতিক্রিয়া জন্য thxs মাইক্রোসফট;)
Mose

39

.NET 4.0 এ আপনি নিম্নলিখিত হিসাবে লিখতে পারেন:

public static bool IsValidGuid(string str)
{
    Guid guid;
    return Guid.TryParse(str, out guid);
}

3
এটি সত্যিই শীর্ষস্থানীয় উত্তরগুলির মধ্যে একটি হওয়া উচিত।
টম লিন্ট

21

আমি অন্তত এটিকে আবার লিখি:

try
{
  value = new Guid(s);
  return true;
}
catch (FormatException)
{
  value = Guid.Empty;
  return false;
}

আপনি SEHException, ThreadAbortException বা অন্যান্য মারাত্মক বা সম্পর্কিত সম্পর্কিত স্টাফগুলিতে "অবৈধ জিইউইডি" বলতে চান না।

আপডেট : .NET 4.0 দিয়ে শুরু করে, গাইডের জন্য একটি নতুন সেট উপলব্ধ রয়েছে:

সত্যই, এগুলি ব্যবহার করা উচিত (কেবলমাত্র যদি সত্য হয় যে, তারা অভ্যন্তরীণভাবে চেষ্টা-ব্যবহার করে "নির্বাকভাবে" প্রয়োগ করা হয়নি)।


13

ইন্টারোপ কেবল ব্যতিক্রম ধরা না থেকে ধীরে ধীরে:

10,000 টি গাইড সহ সুখী পথে:

Exception:    26ms
Interop:   1,201ms

অসুখী পথে:

Exception: 1,150ms
  Interop: 1,201ms

এটি আরও ধারাবাহিক, তবে এটি ধারাবাহিকভাবে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরেও ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে নামিয়ে দেয়। আমার কাছে মনে হচ্ছে আপনি কেবল নিজের হাতছাড়া ব্যতিক্রমগুলি ভাঙার জন্য আপনার ডিবাগারটি কনফিগার করা থেকে ভাল।


"আপনার ডিবাগারটি কেবল অপরিশোধিত ব্যতিক্রমগুলিতেই ভাঙতে পারে" কোনও বিকল্প নয়।
আয়ান

1
@ আইয়ান বয়েড - আপনি যদি কোনও ভিএস সংস্করণ (এক্সপ্রেস সহ) ব্যবহার করেন তবে এটি একটি বিকল্প। এমএসডিএন.মাইক্রোসফট.এইন- ইউএস / লাইবারি/038tzxdw.aspx
মার্ক ব্র্যাকেট

1
আমি বোঝাতে চাইছি এটি একটি সম্ভাব্য বিকল্প নয়। পছন্দ করুন, "ব্যর্থতা কোনও বিকল্প নয়" " এটা তোলে হয় একটি বিকল্প, কিন্তু এক যে আমি ব্যবহার না করার যাচ্ছি।
ইয়ান বয়ড

9

ঠিক আছে, এখানে আপনার প্রয়োজন রেজেক্সটি রয়েছে ...

^[A-Fa-f0-9]{32}$|^({|\\()?[A-Fa-f0-9]{8}-([A-Fa-f0-9]{4}-){3}[A-Fa-f0-9]{12}(}|\\))?$|^({)?[0xA-Fa-f0-9]{3,10}(, {0,1}[0xA-Fa-f0-9]{3,6}){2}, {0,1}({)([0xA-Fa-f0-9]{3,4}, {0,1}){7}[0xA-Fa-f0-9]{3,4}(}})$

তবে তা কেবল শুরু করার জন্য। আপনাকে যাচাই করতে হবে যে বিভিন্ন অংশ যেমন তারিখ / সময় গ্রহণযোগ্য সীমার মধ্যে রয়েছে। আপনি ইতিমধ্যে উল্লিখিত চেষ্টা / ক্যাপচার পদ্ধতির তুলনায় এটি আরও দ্রুততর আমি ভাবতে পারি না। আশা করি আপনি এই ধরণের পরীক্ষার পরোয়ানা দেওয়ার জন্য অনেকগুলি অবৈধ জিইউইডি পাচ্ছেন না!


উম, আইআইআরসি জিইউডিগুলি যেগুলি একটি স্ট্যাম্প স্ট্যাম্প থেকে উত্পন্ন হয় সাধারণত একটি খারাপ ধারণা হিসাবে বিবেচিত হয় এবং অন্য ধরণের (টাইপ 4) সম্পূর্ণরূপে এলোমেলো
বিসিএস

5

ব্যবহারের কারণে - ডিবাগার পপ আপ

আপনি যদি চেষ্টা / ধরার পদ্ধতির দিকে যাচ্ছেন তবে আপনি [সিস্টেম.ডায়াগনস্টিকস.ডেবুগারহিডেন] বৈশিষ্ট্যটি যুক্ত করতে পারেন এটি নিশ্চিত করতে যে আপনি ডিবাগারটি নিক্ষেপ করার জন্য সেট না করেও এটি ভেঙে না যায় make


4

যদিও এটা হল সত্য যা ত্রুটির ব্যবহার করে আরো ব্যয়বহুল, অধিকাংশ মানুষ বিশ্বাস করে যে তাদের GUIDs অধিকাংশ তাই একটি উত্পন্ন কম্পিউটার হতে যাচ্ছে TRY-CATCHঅত্যন্ত ব্যয়বহুল নয় যেহেতু এটি শুধুমাত্র খরচ উত্পন্ন CATCH। আপনি দু'জনের একটি সাধারণ পরীক্ষা দিয়ে নিজের কাছে এটি প্রমাণ করতে পারেন (ব্যবহারকারী, কোনও পাসওয়ার্ড নেই)

আপনি এখানে যান:

using System.Text.RegularExpressions;


 /// <summary>
  /// Validate that a string is a valid GUID
  /// </summary>
  /// <param name="GUIDCheck"></param>
  /// <returns></returns>
  private bool IsValidGUID(string GUIDCheck)
  {
   if (!string.IsNullOrEmpty(GUIDCheck))
   {
    return new Regex(@"^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$").IsMatch(GUIDCheck);
   }
   return false;
  }

4

আমারও একই অবস্থা ছিল এবং আমি লক্ষ্য করেছি যে প্রায় কখনও অবৈধ স্ট্রিং 36 অক্ষর দীর্ঘ নয়। সুতরাং এই তথ্যের উপর ভিত্তি করে, আমি আপনার কোডটিকে আরও সহজ করে রেখে আরও ভাল পারফরম্যান্স পেতে কিছুটা পরিবর্তন করেছি।

public static Boolean TryStrToGuid(String s, out Guid value)
{

     // this is before the overhead of setting up the try/catch block.
     if(value == null || value.Length != 36)
     {  
        value = Guid.Empty;
        return false;
     }

    try
    {
        value = new Guid(s);
        return true;
    }
    catch (FormatException)
    {
        value = Guid.Empty;
        return false;
    }
}

1
গাইড তার সিটরে ড্যাশযুক্ত স্ট্রিং ফর্মের চেয়ে বেশি গ্রহণ করে। জিইউইডিগুলিতে ড্যাশ সহ চারপাশে কোঁকড়ানো ধনুর্বন্ধনী থাকতে পারে বা ড্যাশ বা ধনুর্বন্ধনী থেকে মুক্ত থাকতে পারে। এই বিকল্পগুলি সেই বিকল্পগুলি ব্যবহার করলেও পুরোপুরি বৈধ স্ট্রিং ফর্মগুলি মিথ্যা নেতিবাচক উত্পন্ন করবে।
ক্রিস চরবারুক

1
অনুসরণ করতে, স্ট্রিং-ফর্ম জিইউইডিগুলির জন্য বৈধ দৈর্ঘ্য হ'ল যথাক্রমে খাঁটি হেক্স, ড্যাশড এবং ব্রেস-সহ ড্যাশগুলি।
ক্রিস চরবারুক

1
@ ক্রিস, আপনার বক্তব্যটি বৈধ, তবে @ জেব্রুকস চেষ্টা করার / ধরা দেওয়ার ক্ষেত্রে বাধা দেওয়ার আগে সম্ভাব্য জিইউডিটি পরীক্ষা করার বিষয়টি বিবেচনা করে বিশেষত সন্দেহজনক ইনপুটটি সাধারণ is হতে পারে এর মতো কিছু (মান == নাল || মান। দৈর্ঘ্য <30 || মান। দৈর্ঘ্য> 40) {মান = গাইড। কার্যকর; মিথ্যা ফেরত দিন;}
বিডাব্লু

1
প্রকৃতপক্ষে, এটি আরও ভাল হবে, যদিও আমি 30..40 এর চেয়ে 32,38 রেঞ্জটি শক্ত রাখতে পারি।
ক্রিস চরবারুক

2

আমি যতদূর জানি, এমএসক্রোলিবতে গাইডের মতো ট্রাই পার্সের মতো কিছু নেই। রেফারেন্স উত্স অনুসারে, গাইড টাইপটিতে মেগা-জটিল কনস্ট্রাক্টর রয়েছে যা সমস্ত ধরণের গাইড ফর্ম্যাটগুলি পরীক্ষা করে এবং সেগুলি পার্স করার চেষ্টা করে। আপনি কল করতে পারেন এমন কোনও সহায়ক পদ্ধতি নেই, এমনকি প্রতিচ্ছবিতেও। আমি মনে করি আপনাকে তৃতীয় পক্ষের গাইড পার্সারগুলি অনুসন্ধান করতে হবে, বা আপনার নিজের লিখতে হবে।


2

কোনও RegEx বা এমন কিছু কাস্টম কোড যা সম্ভাব্য জিইউডি চালান যা কমপক্ষে একটি জিইউডির মতো দেখায় এবং কেবল বৈধ অক্ষর ধারণ করে (এবং সম্ভবত এটি সামগ্রিক ফর্ম্যাটের সাথে মানানসই বলে মনে হয়) তা নিশ্চিত করতে স্যানিটি পরীক্ষা করে some যদি এটি স্যানিটি চেকটি পাস না করে তবে একটি ত্রুটি ফিরে আসে - এটি সম্ভবত প্রচুর পরিমাণে অবৈধ স্ট্রিংগুলিকে ছাড়িয়ে যাবে।

তারপরে আপনার উপরের মত স্ট্রিংটি রূপান্তর করুন, তবুও কিছুটা অবৈধ স্ট্রিংয়ের ব্যতিক্রম ধরা যা স্যানিটি চেকের মাধ্যমে পাওয়া যায়।

জোন স্কীট ইনস পার্স করার জন্য অনুরূপ কিছু নিয়ে একটি বিশ্লেষণ করেছিলেন (ট্রাইপার্স ফ্রেমওয়ার্কে আসার আগে): স্ট্রিংটি ইন্টার 32 এ রূপান্তর করা যায় কিনা তা পরীক্ষা করা হচ্ছে

যাইহোক, অ্যান্টনি ডাব্লু জোন্স ইঙ্গিত হিসাবে আপনি সম্ভবত এই সম্পর্কে চিন্তা করা উচিত নয়।


1
 bool IsProbablyGuid(string s)
    {
        int hexchars = 0;
        foreach(character c in string s)
        {
           if(IsValidHexChar(c)) 
               hexchars++;          
        }
        return hexchars==32;
    }

"-" "{" "}" ("এবং") "বৈধ হেক্স অক্ষর নয়, তবে গাইড স্ট্রিংয়ে এটি বৈধ
প্রেস্টন গিলোট

2
এবং এই কোডটি পুরোপুরি ভালভাবে কাজ করবে যদি ইনপুট গাইড স্ট্রিংটিতে সেই অ-হেক্স অক্ষর থাকে
ਰੁਪলো

1
  • প্রতিচ্ছবি পান
  • কপি'ন'পাস্ট গাইডের .ctor (স্ট্রিং)
  • "মিথ্যা প্রত্যাবর্তন" এর সাথে "নতুন থ্রো ..." এর প্রতিটি ঘটনাকে প্রতিস্থাপন করুন।

গাইডের কর্টর একটি সংকলিত রেজেক্স, আপনি ব্যতিক্রমের ওভারহেড ছাড়াই ঠিক একই আচরণ পাবেন।

  1. এটি কি একটি বিপরীত প্রকৌশল গঠন করে? আমি মনে করি এটি করে এবং এটি অবৈধ হতে পারে।
  2. জিইউডি ফর্ম পরিবর্তন হলে ভেঙে যাবে।

এমনকি শীতল সমাধানটি ফ্লাইতে "নতুন থ্রো" প্রতিস্থাপনের মাধ্যমে একটি পদ্ধতিকে গতিময়ভাবে চালিত করা হবে।


1
আমি কোডর থেকে কোড চুরি করার চেষ্টা করেছি, তবে এটির সমর্থন কাজ সম্পাদনের জন্য এটি অনেকগুলি অভ্যন্তরীণ প্রাইভেট ক্লাসের উল্লেখ করে। বিশ্বাস করুন, এটি আমার প্রথম চেষ্টা ছিল।
আয়ান

1

আমি উপরে জোন দ্বারা পোস্ট করা অনুরূপ সমাধান বা অনুরূপ সমাধানের (ইস্প্রোবাইবাইগুইড) পক্ষে ভোট দিয়েছি id আমি আমার রূপান্তর গ্রন্থাগারের জন্য তাদের মতো একটি লিখছি।

আমি মনে করি এটি সম্পূর্ণ লম্পট যে এই প্রশ্নটি এত জটিল হতে হবে। "গাইড" বা "হিসাবে" কীওয়ার্ডটি ঠিকঠাক হবে যদি কোনও গাইড শূন্য থাকে। তবে কোনও কারণে, এসকিউএল সার্ভারের সাথে এটি ঠিক থাকলেও। নেট নেই। কেন? গাইডের মূল্য কী? এম্পটি? এটি নেট নেটওয়ার্কের ডিজাইন দ্বারা তৈরি একটি নির্বোধ সমস্যা এবং যখন কোনও ভাষা সম্মেলন নিজেই পদক্ষেপ নেয় তখন তা সত্যিই আমাকে জাগিয়ে তোলে। এখনও অবধি সবচেয়ে ভাল পারফরম্যান্স করে উত্তরটি COM ইন্টারপ ব্যবহার করে চলেছে কারণ ফ্রেমওয়ার্কটি এটিকে সুক্ষভাবে পরিচালনা করে না? "এই স্ট্রিং কি কোনও জিইউইডি হতে পারে?" উত্তর দেওয়া সহজ এমন একটি প্রশ্ন হওয়া উচিত।

অ্যাপে ইন্টারনেটে না যাওয়া পর্যন্ত নিক্ষেপ করা ব্যতিক্রমটির উপর নির্ভর করা ঠিক আছে। সেই মুহূর্তে আমি কেবল পরিষেবা আক্রমণকে অস্বীকার করার জন্য নিজেকে সেট আপ করেছি। এমনকি যদি আমি "আক্রমণ" নাও করি, আমি জানি কিছু ইয়াহু ইউআরএল দিয়ে বানর নিয়ে চলেছে, অথবা হতে পারে আমার বিপণন বিভাগটি একটি ত্রুটিযুক্ত লিঙ্ক প্রেরণ করবে এবং তারপরে আমার অ্যাপ্লিকেশনটি যথেষ্ট পরিমাণে পারফরম্যান্সের শিকার হতে হবে যা COOLD নিয়ে আসে hit সার্ভারটি ডাউন করে রাখি কারণ এমন একটি সমস্যা হ্যান্ডল করার জন্য আমি আমার কোডটি লিখিনি কারণ এটি ঘটবে না তবে আমরা সকলেই জানি AP

এটি "ব্যতিক্রম" - এ লাইনটিকে কিছুটা ঝাপসা করে - তবে নীচের অংশে, এমনকি সমস্যাটি যদি খুব কমই ঘটে থাকে তবে যদি এটি অল্প সময়ের মধ্যে যথেষ্ট সময় ঘটতে পারে যে আপনার অ্যাপ্লিকেশনটি সমস্ত কিছু থেকে ক্যাচগুলি পরিবেশন করে ক্র্যাশ করে, তবে আমি মনে করি একটি ব্যতিক্রম ছুঁড়ে দেওয়া হচ্ছে খারাপ ফর্ম।

TheRage3K


0

যদি টাইপফুটি টাইপ (মাইভার, অবজেক্ট) গাইড হয় তবে .....


0
Private Function IsGuidWithOptionalBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^[\{]?[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}[\}]?$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function


Private Function IsGuidWithoutBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function


Private Function IsGuidWithBraces(ByRef strValue As String) As Boolean
    If String.IsNullOrEmpty(strValue) Then
        Return False
    End If

    Return System.Text.RegularExpressions.Regex.IsMatch(strValue, "^\{[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}\}$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
End Function

0

সি # তে একটি এক্সটেনশন পদ্ধতি সহ

public static bool IsGUID(this string text)
{
    return Guid.TryParse(text, out Guid guid);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.