কাস্ট () এবং অফটাইপ () লিংকে কখন ব্যবহার করবেন


211

আমি দুটি IEnumerableথেকে কাস্টিং ধরণের দুটি পদ্ধতি সম্পর্কে অবগতArraylist লিনকের মধ্যে এবং ভাবছি যে কোন ক্ষেত্রে সেগুলি ব্যবহার করবেন?

যেমন

IEnumerable<string> someCollection = arrayList.OfType<string>()

অথবা

IEnumerable<string> someCollection = arrayList.Cast<string>()

এই দুটি পদ্ধতির মধ্যে পার্থক্য কী এবং আমি প্রতিটি ক্ষেত্রে কোথায় আবেদন করব?

উত্তর:


322

OfType- কেবলমাত্র সেই উপাদানগুলিকে ফেরত পাঠান যা নিরাপদে এক্স টাইপ করতে পারে।
Cast- সমস্ত উপাদান এক্স টাইপ করার চেষ্টা করবে। যদি তাদের মধ্যে কিছু এই ধরণের না হয় তবে আপনি পাবেনInvalidCastException


উদাহরণস্বরূপ সম্পাদনা করুন :

object[] objs = new object[] { "12345", 12 };
objs.Cast<string>().ToArray(); //throws InvalidCastException
objs.OfType<string>().ToArray(); //return { "12345" }

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

6
@ এসএলাক্স সঠিকভাবে নির্দেশ করে যে আপনার Cast<T>যখন সংগ্রহের মধ্যে কেবলমাত্র টাইপ Tউপাদান রয়েছে তা আপনি জানেন তখন আপনার ব্যবহার করা উচিত । টাইপ চেক OfType<T>কারণে ধীর is। সংগ্রহে ধরনের হয়, তাহলে IEnumerable<T>, Cast<T>কেবল হিসাবে পুরো সংগ্রহে নিক্ষেপ করা হবে IEnumerable<T>এবং এড়ানোর এটা enumerating; OfType<T>এখনও গণনা করা হবে। সুত্র: stackoverflow.com/questions/11430570/...
মাদকসেবী

23
এমনকি .Cast<string>()যখন এটি গণনা করা হয় তখন নিক্ষেপ করে না এমন ক্ষেত্রেও এটি সমতুল্য নয়.OfType<string>() । কারণ হ'ল nullমানগুলি সর্বদা এড়িয়ে যায় .OfType<TResult>()। উদাহরণ: new System.Collections.ArrayList { "abc", "def", null, "ghi", }.OfType<string>().Count()কেবল দেবে 3; .Cast<string>()মূল্যায়ন সঙ্গে একই অভিব্যক্তি 4
জেপ্পে স্টিগ নীলসেন

1
অন্য কথায়, এটি 'হিসাবে' এবং 'কাস্ট' অপারেটরগুলির মধ্যে পার্থক্যের মতো কিছু
ফাজা

111

http://solutionizing.net/2009/01/18/linq-tip-enumerable-oftype/

মৌলিকভাবে, কাস্ট () এইভাবে প্রয়োগ করা হয়:

public IEnumerable<T> Cast<T>(this IEnumerable source)
{
  foreach(object o in source)
    yield return (T) o;
}

একটি সুস্পষ্ট কাস্ট ব্যবহার করে ভাল অভিনয় করে তবে কাস্ট ব্যর্থ হলে অবৈধ কাস্টেক্সেক্সেপশন ঘটবে। এই ধারণায় একটি কম দক্ষ তবে কার্যকর বৈচিত্রটি হল অফটাইপ ():

public IEnumerable<T> OfType<T>(this IEnumerable source)
{
  foreach(object o in source)
    if(o is T)
      yield return (T) o;
}

ফিরে আসা গণনাতে কেবলমাত্র নির্দিষ্ট উপাদানগুলিতে নিরাপদে কাস্ট করা যেতে পারে এমন উপাদানগুলি অন্তর্ভুক্ত থাকবে।


38

আপনার Cast<string>()যদি কল হয় যে আপনি যদি জানেন যে সমস্ত আইটেম stringগুলি হয়।
যদি তাদের কিছু স্ট্রিং না হয় তবে আপনি একটি ব্যতিক্রম পাবেন।

আপনি যদি কল করতে OfType<string>()পারেন যে কিছু আইটেমগুলি না হয় stringএবং আপনি এই আইটেমগুলি না চান।
যদি তাদের মধ্যে কিছু স্ট্রিং না হয় তবে সেগুলি নতুন হবে না IEnumerable<string>


1
এই উত্তরটি (বর্তমানে) কেবলমাত্র কোনওটি যখন কোন পদ্ধতিটি ব্যবহার করবেন তখন একটি সুস্পষ্ট পরামর্শ দেয়।
কোডফক্স

4

এটা লক্ষ করা উচিত Cast(Of T)IEnumerable অন্যান্য লিনকিউ ফাংশনগুলির বিপরীতে ব্যবহার করা যেতে পারে , তাই যদি আপনার কোনও জেনারিক সংগ্রহ বা লিঙ্কের মতো তালিকাতে লিনকিউ ArrayListব্যবহার Cast(Of T)করার প্রয়োজন হয় তবে আপনি IEnumerable(Of T)লিনকিউ যেখানে কাজ করতে পারবেন সেখানে cast ালতে ব্যবহার করতে পারেন।


2

Cast()সংগ্রহের সমস্ত উপাদান নিক্ষেপ করার চেষ্টা করবে (এবং উপাদানটি ভুল ধরণের হলে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে) যখন OfType()কেবল সঠিক ধরণের উপাদানই ফেরত দেবে।


2

OfTypeনির্দিষ্ট ধরণের শুধুমাত্র ফিরে আসতে উপাদানগুলি ফিল্টার করবে। Castকোনও উপাদানকে লক্ষ্য ধরণের কাস্ট করা না গেলে ক্রাশ হবে sh


2

Cast<T>প্রদত্ত ধরণে সমস্ত আইটেম কাস্ট করার চেষ্টা করবে T। এই কাস্ট ব্যর্থ হতে পারে বা ব্যতিক্রম ছুঁড়ে ফেলতে পারে। OfType<T>আসল সংগ্রহের একটি উপসেট ফেরত দেবে এবং কেবল টাইপযুক্ত অবজেক্টগুলিকে ফিরিয়ে দেবে T

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.