সিকোয়েন্সে কোনও মিলের উপাদান নেই


112

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

if (_lstAcl.Documents.Count > 0)
{
    for (i = 0; i <= _lstAcl.Documents.Count - 1; i++)
    {
        string id = _lstAcl.Documents[i].ID.ToString();                           
        var documentRow = _dsACL.Documents.First(o => o.ID == id);
        if (documentRow !=null)
        {

            _lstAcl.Documents[i].Read = documentRow.Read;
            _lstAcl.Documents[i].ReadRule = documentRow.ReadRule;

            _lstAcl.Documents[i].Create= documentRow.Create;
            _lstAcl.Documents[i].CreateRule = documentRow.CreateRule;

            _lstAcl.Documents[i].Update = documentRow.Update;
            _lstAcl.Documents[i].UpdateRule = documentRow.UpdateRule;

            _lstAcl.Documents[i].Delete = documentRow.Delete;
            _lstAcl.Documents[i].DeleteRule = documentRow.DeleteRule;
        }
    }
}

উত্তর:


220

ঠিক আছে, আমি আশা করব এটি এই লাইনটি ব্যতিক্রম ছুঁড়েছে:

var documentRow = _dsACL.Documents.First(o => o.ID == id)

First()এটি কোনও মিলে যাওয়া উপাদান না পেলে একটি ব্যতিক্রম ছুঁড়ে ফেলবে। প্রদত্ত যে আপনি তত্ক্ষণাত নাল পরীক্ষা করছেন, মনে হচ্ছে আপনি চান FirstOrDefault()যা কোনও মিলের আইটেম না পাওয়া গেলে উপাদান টাইপের (যা রেফারেন্স টাইপের জন্য নাল) এর ডিফল্ট মান দেয়:

var documentRow = _dsACL.Documents.FirstOrDefault(o => o.ID == id)

কিছু পরিস্থিতিতে বিবেচনার জন্য অন্যান্য বিকল্পগুলি হ'ল Single()(যখন আপনি বিশ্বাস করেন যে ঠিক একটি মিলের উপাদান রয়েছে) এবং SingleOrDefault()(যখন আপনি বিশ্বাস করেন যে ঠিক এক বা শূন্য ম্যাচের উপাদান রয়েছে)। আমি সন্দেহ করি যে FirstOrDefaultএটি এই বিশেষ ক্ষেত্রে সেরা বিকল্প, তবে যাইহোক অন্যদের সম্পর্কে এটি জেনে রাখা মূল্যবান।

অন্যদিকে, দেখে মনে হচ্ছে আপনি এখানে প্রথম স্থানটিতে যোগদানের মাধ্যমে সম্ভবত ভাল হতে পারেন। আপনি যদি খেয়াল না করেন যে এটি সমস্ত ম্যাচ করবে (কেবল প্রথমের চেয়ে বরং) আপনি ব্যবহার করতে পারেন:

var query = from target in _lstAcl.Documents
            join source in _dsAcl.Document
            where source.ID.ToString() equals target.ID
            select new { source, target };
foreach (var pair in query)
{
    target.Read = source.Read;
    target.ReadRule = source.ReadRule;
    // etc
}

এটি সহজ এবং আরও কার্যকর আইএমও।

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

  • বাইরের থেকে মুক্তি দিন if। আপনার এটির দরকার নেই, যেমন কাউন্ট শূন্য হয় লুপ বডি কখনই কার্যকর হয় না
  • লুপগুলির জন্য একচেটিয়া উপরের সীমানা ব্যবহার করুন - এগুলি সি # তে আরও মূর্তিমান:

    for (i = 0; i < _lstAcl.Documents.Count; i++)
  • সাধারণ সুবেশনগুলি দূর করুন:

    var target = _lstAcl.Documents[i];
    // Now use target for the rest of the loop body
  • শুরু করার foreachপরিবর্তে যেখানে ব্যবহার সম্ভব for:

    foreach (var target in _lstAcl.Documents)

39

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

_dsACL.Documents.FirstOrDefault(o => o.ID == id);

19
কেবল সামান্য স্পষ্ট করার জন্য - প্রথমে সাধারণভাবে নাল ফিরে আসতে পারে , যদি আপনার ভবিষ্যদ্বাণীক নাল মানগুলিতে মেলে। এটি কেবল এখানে নাল ফিরতে পারে না, যেমন o.IDনাল মানের উপর একটি নালরফেরান এক্সেক্সশন নিক্ষেপ করবে।
জন স্কিটি

11

এমএসডিএন গ্রন্থাগার থেকে:

First<TSource>(IEnumerable<TSource>)পদ্ধতি একটি ব্যতিক্রম ছোঁড়ার যদি উৎস কোন উপাদানগুলি রয়েছে। উত্স সিকোয়েন্সটি ফাঁকা থাকলে ডিফল্ট মানটি পরিবর্তনের জন্য, FirstOrDefaultপদ্ধতিটি ব্যবহার করুন ।


0

আপনারা যারা প্রসঙ্গ মেনু দিয়ে একটি নিয়ামক তৈরি করার সময় এই সমস্যার মুখোমুখি হয়েছিলেন, প্রশাসক হিসাবে ভিজ্যুয়াল স্টুডিওটি পুনরায় খোলার বিষয়টি এটি স্থির করে।


-4

প্রথম () এর আগে কোথায় () ব্যবহার করা আপনাকে সহায়তা করতে পারে, কারণ এই ক্ষেত্রে আমার সমস্যাটি সমাধান হয়ে গেছে।

var documentRow = _dsACL.Documents.Where(o => o.ID == id).FirstOrDefault();

3
এখানে আপনাকে আসলে কী সাহায্য করেছে তা হল .প্রথম () এর পরিবর্তে ফার্স্টআরডিফল্ট () ব্যবহার করুন .কখন (ও => ও.আইডি == আইডি) ) অভিন্ন হবে।
pwdst

@pwdst যেখানে শর্ত এবং সেখানে কোনও ল্যাম্বডা অভিব্যক্তি ছাড়াই ফার্স্টআরডিফল্ট ব্যবহার করুন using
এলনাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.