মানটি একটি অ্যারেতে রয়েছে কিনা তা পরীক্ষা করুন (সি #)


109

মান # সি তে অ্যারেতে রয়েছে কিনা তা আমি কীভাবে চেক করব?

পছন্দ করুন, আমি প্রিন্টারের নামের তালিকা সহ একটি অ্যারে তৈরি করতে চাই।

এগুলি একটি পদ্ধতিতে খাওয়ানো হবে, যা প্রতিটি স্ট্রিংকে ঘুরে দেখবে এবং স্ট্রিংটি যদি অ্যারের মানের মতো হয় তবে সেই ক্রিয়াটি করুন।

উদাহরণ স্বরূপ:

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
foreach (p in printer)
{
   PrinterSetup(p);     
}

এগুলি মুদ্রকের নাম, তারা প্রিন্টারসেটআপ পদ্ধতিতে খাওয়ানো হচ্ছে।

প্রিন্টারসেটআপ এর মতো সাজানো দেখতে পাবেন (কিছু সিউডোকোড):

public void PrinterSetup(printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

if (printer == "jupiter")সি # চিনতে পারে এমন উপায়ে আমি কীভাবে ফর্ম্যাট করব ?


4
আপনার পরামিতিটির নামটি একটি ধরণের (স্ট্রিং) দেওয়ার চেষ্টা করুন এবং এটি ঠিক থাকবে।
জন স্কিটি

2
আমি প্রশ্ন হিসাবে বিভ্রান্ত এক ধরনের। আপনি কী জিজ্ঞাসা করছেন যে কীভাবে কোনও অ্যারেতে মান রয়েছে কিনা তা পরীক্ষা করে দেখুন, বা সি # তে স্ট্রিং-তুলনা কীভাবে করবেন? যদি এটি পরে থাকে তবে আপনি ব্যবহার করবেন printer.Equals("jupiter")। যদি এটি প্রাক্তন হয় তবে ব্যবহার করুন linqএবংprinter.Contains("jupiter")
newf আসবাবy

@ নতুন ফার্নিটারি বেশ তাই ... প্রশ্নটি বিভ্রান্ত, উদাহরণ কোড শিরোনামের সাথে মেলে না, এবং উত্তরগুলি একইভাবে বিভ্রান্ত হয়; কেন এইরকম বকাঝকাটি উজ্জীবিত হয় তা আমার বাইরে। এবং করার দরকার নেই printer.Equals("jupiter")... ওপির কোডটি if (printer == "jupiter")ঠিক ঠিক কাজ করে ... যতক্ষণ printerনা স্কিটিং নোট হিসাবে স্ট্রিং হিসাবে ঘোষণা করা হয়।
জিম বাল্টার

উত্তর:


231

প্রয়োজনীয় নামস্থান যুক্ত করুন

using System.Linq;

তারপরে আপনি লিনক Contains()পদ্ধতিটি ব্যবহার করতে পারেন

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
if(printer.Contains("jupiter"))
{
    Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
}

2
@ 0A0D। এই উত্তরটি আমি একই জিনিস অর্জন করার সহজ / সংক্ষিপ্ত এবং সুপরিচিত উপায় হিসাবে সহজ হিসাবে মনে করি ( How do I check if a value is in an array in C#?) এবং দক্ষও best কোনও লুপ নেই কোনও অতিরিক্ত পদ্ধতি। শুধু একটি নেমস্পেস অতিরিক্ত যা কোনও বড় জিনিস নয়।
সামি

6
@ সামি: লিনক অভ্যন্তরীণভাবে লুপ ব্যবহার করে।

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

1
ডান @ 0A0D। আমি কোডার / বিকাশকারীকে সঠিক লুপের প্রয়োজন নেই। অ্যারে থেকে পাঠ্যক্রমের চেকের জন্য একটি লুপ দরকার :)
সামি

3
এটি অবশ্যই সহজ এবং সুপারিশযোগ্য। যদি আপনার লিনক অ্যাক্সেস না থাকে বা লিনক ব্যবহার করতে না চান তবে আপনি অ্যারের কিছু স্পষ্টত ইন্টারফেস প্রয়োগের উপর নির্ভর করতে পারেন । .NET 1.1 আমাদের যেহেতু ((IList)printer).Contains("Jupiter")অ-জেনেরিক (মূল্যের ধরণের ধরণের বাক্স বাক্স ইত্যাদি) রয়েছে এবং এটি বহু-মাত্রিক অ্যারেগুলির জন্যও কাজ করে। এবং .NET 2.0 থেকে আমাদের কাছে আরও যাদু রয়েছে ((IList<string>)printer).Contains("Jupiter")যা আরও টাইপ-সেফ। .NET 3.5 এ লিনাক পদ্ধতির নতুন ছিল।
জেপ্প স্টিগ নীলসেন

29
   string[] array = { "cat", "dot", "perls" };

// Use Array.Exists in different ways.
bool a = Array.Exists(array, element => element == "perls");
bool b = Array.Exists(array, element => element == "python");
bool c = Array.Exists(array, element => element.StartsWith("d"));
bool d = Array.Exists(array, element => element.StartsWith("x"));

// Display bools.
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
----------------------------output-----------------------------------

1) সত্য 2) মিথ্যা 3) সত্য 4) মিথ্যা


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

22
if ((new [] {"foo", "bar", "baaz"}).Contains("bar"))
{

}  

এটি একটি সাধারণ উদাহরণ - আপনি কি আরও ভাল প্রশ্নের সাথে মেলে এমন একটি সরবরাহ করতে পারেন?
Kaz

9
এটি একটি সাধারণ উদাহরণ হতে পারে তবে এটি আমি ঠিক যা খুঁজছিলাম।
গ্রান্ট বার্চমিয়ার

7

এটার মতো কিছু?

string[] printer = {"jupiter", "neptune", "pangea", "mercury", "sonic"};
PrinterSetup(printer);

// redefine PrinterSetup this way:
public void PrinterSetup(string[] printer)
{
    foreach (p in printer.Where(c => c == "jupiter"))
    {
        Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
    }
}

7
    public static bool Contains(Array a, object val)
    {
        return Array.IndexOf(a, val) != -1;
    }

2
আমি এই পছন্দ। তবে এটি ব্যতিক্রম হবে যদি ব্যতিক্রম aব্যতীত একটি বহুমাত্রিক অ্যারে (যেমন new string[10, 20, 15]উদাহরণস্বরূপ) হয়। এটি Array.CreateInstance(typeof(string), new[] { 5, }, new[] { -2, })সম্ভাব্য ভুল ফেরতের মান সহ শূন্য থেকে সূচিকৃত নয় এমন এক-মাত্রিক অ্যারেগুলি (যেমন , সি # আমি স্বীকার করি বিরল) দিয়েও ব্যর্থ হবে । এই ত্রুটিগুলি জেনেরিকের সাথে সমাধান করা সহজ:public static bool Contains<TElement>(TElement[] a, TElement val) { return Array.IndexOf(a, val) != -1; }
জেপ্পে স্টিগ নীলসেন

আমি এটি পছন্দ করি তবে এটি কেবল লিনক ব্যতীত এবং এটি নিশ্চিত করে যে সূচকগুলি কেবলমাত্র ব্যবহার করার মতো বাকী
বিটারব্লিউ

6

দ্রষ্টব্য: প্রশ্নটি স্ট্রিংগুলির অ্যারে সম্পর্কে। উল্লিখিত রুটিনগুলি একক স্ট্রিংয়ের অন্তর্ভুক্ত পদ্ধতির সাথে মিশ্রিত হবে না।

আমি বিভিন্ন সি # সংস্করণ এবং দুটি কারণে উল্লেখ করে একটি প্রসারিত উত্তর যুক্ত করতে চাই:

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

  • কোনও কার্যক্রমে এটি রাখার জন্য যেখানে বলা হয়েছিল সেখানে সরাসরি কোনও উত্তর উপস্থিত হয় না (যেমন কিছু উত্তরও স্ট্রিংগুলির অ্যারেগুলির সাথে স্ট্রিং মিশ্রিত করছে, এটি সম্পূর্ণ গুরুত্বহীন নয়)।

অ্যারে.এক্সিস্টস () একটি সি # /। নেট 2.0 2.0 পদ্ধতি এবং কোনও লিনক প্রয়োজন নেই। অ্যারেগুলিতে অনুসন্ধান করা হচ্ছে ও (এন)। আরও দ্রুত অ্যাক্সেসের জন্য হ্যাশসেট বা অনুরূপ সংগ্রহগুলি ব্যবহার করুন।

.NET 3.5 যেহেতু একটি জেনেরিক পদ্ধতি উপস্থিত রয়েছে Array<T>.Exists():

public void PrinterSetup(string[] printer)
{
   if (Array.Exists(printer, x => x == "jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

একই / অনুরূপ "সিনট্যাকটিক চিনি যোগ করতে আপনি নিজস্ব এক্সটেনশন পদ্ধতি (সি # 3.0 এবং উপরে) লিখতে পারেন" লিঙ্ককে অন্তর্ভুক্ত না করে সমস্ত অ্যারেগুলির স্ট্রিং হিসাবে কন্টেন্টগুলি ":

// Using the generic extension method below as requested.
public void PrinterSetup(string[] printer)
{
   if (printer.ArrayContains("jupiter"))
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC");
   }
}

public static bool ArrayContains<T>(this T[] thisArray, T searchElement)
{
   // If you want this to find "null" values, you could change the code here
   return Array.Exists<T>(thisArray, x => x.Equals(searchElement));
}

ArrayContains()এক্ষেত্রে এই পদ্ধতিটি ব্যবহার করা হয়, লিনকের অন্তর্ভুক্ত পদ্ধতিটি নয়।

অন্য কোথাও উল্লিখিত হয়েছে। অন্তর্ভুক্ত পদ্ধতিগুলি List<T>.Contains(সি # ২.০ থেকে) বা ArrayList.Contains(সি # ১.১ থেকে যেহেতু) উল্লেখ করে তবে সরাসরি এ্যারে না করে।


1
লিনক কনটেইনস ()
পিটার.সেক

আমি এটি করেছি, যদিও এর বিরুদ্ধে যুক্তিও রয়েছে: বিভিন্ন উপাত্তের জন্য একই নামটি ব্যবহার করা বিশেষত একটি পলিমারফিজমের প্রাথমিক ধারণা, বিশেষত একটি লিঙ্ক-সেটিংটি মাথায় রেখে। বিভিন্ন নাম ব্যবহার করা বহুমুখ নয়। তবে পাঠযোগ্যতা এবং ভুল বোঝাবুঝি এড়ানো জিতবে, আমার মনে হয়, তাই, হ্যাঁ।
ফিল্ম

4

আপনি আপনার পদ্ধতিতে স্রেফ কিছু অনুপস্থিত:

public void PrinterSetup(string printer)
{
   if (printer == "jupiter") 
   {
      Process.Start("BLAH BLAH CODE TO ADD PRINTER VIA WINDOWS EXEC"");
   }
}

শুধু যোগ করুন stringএবং আপনি ভাল থাকবেন।


3

আপনার সমস্যাটি কী তা খুব পরিষ্কার নয়, তবে মনে হচ্ছে আপনি এই জাতীয় কিছু চান:

    List<string> printer = new List<string>( new [] { "jupiter", "neptune", "pangea", "mercury", "sonic" } );

    if( printer.Exists( p => p.Equals( "jupiter" ) ) )
    {
        ...
    }

2

দেখার পারফরম্যান্সের স্বার্থে HashSet<T>ক্লাস ব্যবহার বিবেচনা করুন :

এই পদ্ধতিটি একটি ও (1) অপারেশন।

- HashSet<T>.Containsপদ্ধতি (টি), এমএসডিএন

উদাহরণ স্বরূপ:

class PrinterInstaller
{
    private static readonly HashSet<string> PrinterNames = new HashSet<string>
        {
            "jupiter", "neptune", "pangea", "mercury", "sonic"
        };

    public void Setup(string printerName)
    {
        if (!PrinterNames.Contains(printerName))
        {
            throw new ArgumentException("Unknown printer name", "printerName");
        }
        // ...
    }
}

1

তালিকায় নকল কীভাবে পাওয়া যায় এবং কীভাবে সেগুলি সরানো যায় তার দুর্দান্ত উপায় খুঁজে পেতে আমি এখন ২ ঘন্টা চেয়ে বেশি অনুসন্ধান করেছি । এখানে সহজ উত্তর:

//Copy the string array with the filtered data of the analytics db into an list
// a list should be easier to use
List<string> list_filtered_data = new List<string>(analytics_db_filtered_data);

// Get distinct elements and convert into a list again.
List<string> distinct = list_filtered_data.Distinct().ToList();

আউটপুটটি দেখতে এইরকম হবে: ডুপ্লিকেট এলিমেন্টগুলি নতুন তালিকাতে আলাদা আলাদা নামেই সরানো হবে!

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