আমি কীভাবে নিশ্চিত করতে পারি যে ফার্স্টঅর্ডার ডিফল্ট <কীভ্যালিউপায়ার> কোনও মান ফিরিয়ে দিয়েছে


91

আমি যা করার চেষ্টা করছি তার একটি সরল সংস্করণ এখানে:

var days = new Dictionary<int, string>();
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");

var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));

অভিধানে 'xyz' উপস্থিত না থাকায়, ফার্স্টআরডিফল্ট পদ্ধতিটি কোনও বৈধ মান ফেরত দেবে না। আমি এই পরিস্থিতির জন্য যাচাই করতে সক্ষম হতে চাই কিন্তু আমি বুঝতে পারি যে ফলাফলটিকে আমি "নাল" এর সাথে তুলনা করতে পারছি না কারণ কীভ্যালিউপায়ার একটি স্ট্রুক। নিম্নলিখিত কোডটি অবৈধ:

if (day == null) {
    System.Diagnotics.Debug.Write("Couldn't find day of week");
}

আমরা কোডটি সংকলনের চেষ্টা করেছি, ভিজ্যুয়াল স্টুডিও নিম্নলিখিত ত্রুটিটি ছুড়ে ফেলেছে:

Operator '==' cannot be applied to operands of type 'System.Collections.Generic.KeyValuePair<int,string>' and '<null>'

আমি কীভাবে চেক করতে পারি যে ফার্স্টঅরডিফল্ট একটি বৈধ মান ফিরিয়ে দিয়েছে?


4
আপনার সেখানে একটি বাগ রয়েছে, তবে আমি ধরে নিলাম এটি একটি অনুলিপি-পেস্ট জিনিস: দিনগুলি কোনও তালিকা নয় এবং আপনি কীভ্যালিউপায়ারটিতে অ্যাড ব্যবহার করতে পারবেন না।
কোবি

ওফস ... আপনি ঠিক বলেছেন আমি মেমরি থেকে টাইপ করছিলাম এবং আমি অবশ্যই একটি ভুল করেছি। এটা ইশারা জন্য ধন্যবাদ।
desautelsj

4
এটি সম্ভবত ছিল: var দিন = নতুন অভিধান <int, স্ট্রিং> ();
এমনকি Mien,

উত্তর:


156

FirstOrDefaultনাল ফিরে না, এটি ফিরে আসে default(T)
আপনার জন্য এটি পরীক্ষা করা উচিত:

var defaultDay = default(KeyValuePair<int, string>);
bool b = day.Equals(defaultDay);

এমএসডিএনEnumerable.FirstOrDefault<TSource> থেকে - :

ডিফল্ট ( টিএসোর্স ) উত্স ফাঁকা থাকলে; অন্যথায়, উত্স প্রথম উপাদান ।

মন্তব্য:



6
@ পেপার 1337 - ধন্যবাদ, তবে আমি কোথায় মিস করছি typeof? এই কোডটি সংকলন এবং কাজ করে।
কোবি

4
আমি এখানে এসেছি কারণ এটি আমার কাছে পরিষ্কার ছিল না, এর default(KeyValuePair<T1, T2>)ফলে কী হবে Ok ঠিক আছে, এটি বেশ স্পষ্ট হওয়া উচিত ছিল, এটির ফলে খালি কেভিপি হবে। তবে "সুস্পষ্ট হওয়া" যথাযথ অ্যাপ্লিকেশনগুলি লেখার পক্ষে ভাল পদ্ধতি নয় (এবং আমার বর্তমান প্রয়োগটি পরিষ্কারভাবে / পরিষ্কারভাবে এই কেসকে উস্কে দেওয়ার পক্ষে জটিল) তাই আমি এটি একটি নতুন প্রকল্প দিয়ে চেষ্টা করেছি এবং - প্রকৃতপক্ষে - এটি KeyValuePairবৈশিষ্ট্য Keyএবং Valueসত্তার সাথে একটি ফিরিয়ে দিয়েছে উভয় NULL.... কেবল এই 5 মিনিটের বোকামির কিছু অন্যান্য লোককে নিরাপদে রাখতে ;-)
নিকোলাস

@ নিকোলাস - এখানে কোন বোকামি নেই। নিজের জন্য যাচাই করা এবং আপনি নিজের কোডটি বুঝতে পেরেছেন তা নিশ্চিত করা সর্বদা একটি ভাল ধারণা। আমি defaultকীওয়ার্ডের সাথে একটি লিঙ্ক যুক্ত করেছি , এটি এখানে স্পষ্টভাবে অনুপস্থিত। ধন্যবাদ!
কোবি

4
@ জেফব্রিডগম্যান - এটি সত্যই একটি ভাল পয়েন্ট! বিশেষত এখানে এটি সম্ভব নয়, কারণ আমরা কাজ করছি KeyValuePair। আপনার যদি জেনেরিক কোড day.Equalsথাকে তবে তাও বাতিল-নিরাপদ নয় এবং আমি ব্যবহার করতে পারতামEqualityComparer<T>.Default.Equals(day, defaultDay)
Kobi

55

এটি আমার মতে সবচেয়ে স্পষ্ট এবং সংক্ষিপ্ত উপায়:

var matchedDays = days.Where(x => sampleText.Contains(x.Value));
if (!matchedDays.Any())
{
    // Nothing matched
}
else
{
    // Get the first match
    var day = matchedDays.First();
}

স্ট্রাইকগুলির জন্য এটি সম্পূর্ণরূপে অদ্ভুত ডিফল্ট মান স্টাফ ব্যবহার করে around


13
এর সাথে সমস্যাটি হ'ল এমন সম্ভাবনা রয়েছে (বাস্তবায়নের উপর নির্ভর করে) যে দিনগুলি গণনার দিন দু'বার গণনা করা হবে, বা আরও খারাপ, যে কোনও () এবং প্রথম () কলগুলির মধ্যে পৃথক মানগুলি
ফেরান

@ রায়বুইসেন টোআরাই বা টোলিস্টের একটি কল সমস্যার সমাধান করে এবং আপনি গণনা / দৈর্ঘ্য এবং একটি সূচক ব্যবহার করতে পারেন।
কনসোল

4
মনে রাখবেন যে @ রায়ের উত্তর এখানে প্রযোজ্য নয়, কারণ daysএটি Dictionary<int,string>। সুতরাং এটি হিসাবে বিবেচিত হবে IEnumerable<KeyValuePair<int,string>>, তারপরে কখন Any()এবং First()ডাকা হবে প্রত্যাশার সাথে আচরণ করবে । আমি অনুমান করি যে অন্যান্য বাস্তবায়নও রয়েছে যা বিভিন্নভাবে আচরণ করতে পারে IEnumerable<>। আমি কিছু মিস করছি কিনা জানি না।
ইমানুয়েল বেলিনী

0

পরিবর্তে আপনি এটি করতে পারেন:

var days = new Dictionary<int?, string>();   // replace int by int?
days.Add(1, "Monday");
days.Add(2, "Tuesday");
...
days.Add(7, "Sunday");

var sampleText = "My favorite day of the week is 'xyz'";
var day = days.FirstOrDefault(x => sampleText.Contains(x.Value));

এবং তারপর :

if (day.Key == null) {
    System.Diagnotics.Debug.Write("Couldn't find day of week");
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.