লিনকুই: "রয়েছে" এবং একটি ল্যাম্বডো ক্যোয়ারী


168

আমি একটি আছে List<BuildingStatus>বলা buildingStatus। আমি এটির এমন একটি স্থিতি রয়েছে কিনা যাচাই করতে চাই, যার চর কোডটি (ফিরে এসেছে GetCharCode()) কিছু ভেরিয়েবলের সমান v.Status,।

নীচে (সংকলনবিহীন) কোডের লাইন বরাবর এটি করার কোনও উপায় আছে?

buildingStatus.Contains(item => item.GetCharValue() == v.Status)

উত্তর:


320

এর Any()পরিবর্তে ব্যবহার করুন Contains():

buildingStatus.Any(item => item.GetCharValue() == v.Status)

13
খুশী হলাম। আমি ভাবছি যে লিন্থে কেন কোনও Contains()পদ্ধতি সরবরাহ করে না , এবং তখন আমি বুঝতে পারি যে এটির Any()পরিবর্তে এটি হওয়ার কথা । +1
নোলোনার

38

লিনক এক্সটেনশন পদ্ধতি যে কোনও আপনার পক্ষে কাজ করতে পারে ...

buildingStatus.Any(item => item.GetCharValue() == v.Status)

4

Containsআপনি যা চান তা অর্জন করতে আপনি কীভাবে এটি ব্যবহার করতে পারেন:

buildingStatus.Select(item => item.GetCharValue()).Contains(v.Status) এটি একটি বুলিয়ান মান প্রদান করবে।


3

আপনি যা সন্ধান করছেন তা আমি নিশ্চিত নই, তবে এই প্রোগ্রামটি:

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public StatusType Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = Building.StatusType.open },
        new Building () { Name = "two", Status = Building.StatusType.closed },
        new Building () { Name = "three", Status = Building.StatusType.weird },

        new Building () { Name = "four", Status = Building.StatusType.open },
        new Building () { Name = "five", Status = Building.StatusType.closed },
        new Building () { Name = "six", Status = Building.StatusType.weird },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };

        var q = from building in buildingList
                where statusList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);
    }

প্রত্যাশিত আউটপুট উত্পাদন করে:

one: open
two: closed
four: open
five: closed

এই প্রোগ্রামটি এনামের একটি স্ট্রিং উপস্থাপনা তুলনা করে এবং একই আউটপুট উত্পাদন করে:

    public class Building
    {
        public enum StatusType
        {
            open,
            closed,
            weird,
        };

        public string Name { get; set; }
        public string Status { get; set; }
    }

    public static List <Building> buildingList = new List<Building> ()
    {
        new Building () { Name = "one", Status = "open" },
        new Building () { Name = "two", Status = "closed" },
        new Building () { Name = "three", Status = "weird" },

        new Building () { Name = "four", Status = "open" },
        new Building () { Name = "five", Status = "closed" },
        new Building () { Name = "six", Status = "weird" },
    };

    static void Main (string [] args)
    {
        var statusList = new List<Building.StatusType> () { Building.StatusType.open, Building.StatusType.closed };
        var statusStringList = statusList.ConvertAll <string> (st => st.ToString ());

        var q = from building in buildingList
                where statusStringList.Contains (building.Status)
                select building;

        foreach ( var b in q )
            Console.WriteLine ("{0}: {1}", b.Name, b.Status);

        Console.ReadKey ();
    }

আমি এই এক্সটেনশান পদ্ধতিটি একটি আইইনিউমারেবলকে অন্যে রূপান্তর করতে তৈরি করেছি, তবে আমি নিশ্চিত না যে এটি কতটা দক্ষ; এটি কেবল পর্দার আড়ালে একটি তালিকা তৈরি করতে পারে।

public static IEnumerable <TResult> ConvertEach (IEnumerable <TSource> sources, Func <TSource,TResult> convert)
{
    foreach ( TSource source in sources )
        yield return convert (source);
}

তারপরে আপনি যেখানে ক্লজটি এতে পরিবর্তন করতে পারেন:

where statusList.ConvertEach <string> (status => status.GetCharValue()).
    Contains (v.Status)

এবং শুরুতে এর List<string>সাথে তৈরিটি এড়িয়ে ConvertAll ()যান।


ধন্যবাদ লরি যে কাজ করেছে, আমি এখানে আপনার কোডটি উল্লেখ করে যা করেছি ... তবে যদি নতুন তালিকা তৈরি না করতে হয় তবে সম্ভব হত যদি ভাল হয় ???? // ব্যবহৃত টোললিস্ট কারণ এটি একটি আইআইএলএসটি এবং আমার গেটচার্যালু চালায় // এটি আমার চরের ভরা স্ট্যাটাস স্ট্রিংলিস্ট = বিল্ডিং.টোলিস্ট () দিয়ে রূপান্তর করে একটি "নতুন" তালিকা তৈরি করে। var টেস্ট = ভি থেকে ইন ক্রি যেখানে স্ট্যাটাস স্ট্রিংলিস্ট. কনটেনস (ভি। স্ট্যাটাস) ভি নির্বাচন করুন; সমস্ত কাজ, যেমন আমি বলেছি এটি একটি নতুন তালিকা না করে বা কনটেন্সের ভিতরে ল্যাম্বডা ব্যবহার না করা ভাল তবে এটি কি সম্ভব নয়?
চিহ্নিত করুন

আমি ধরে নিই স্থিতি সম্পত্তিটি একটি স্ট্রিং; সুতরাং আপনাকে প্রতিটি তুলনার জন্য স্ট্যাটাস এনামগুলিকে স্ট্রিংয়ে রূপান্তর করতে হবে। আপনি শুরুতে একবার এগুলি রূপান্তর করতে পারেন এবং এটি দিয়ে সম্পন্ন করতে পারেন।
XXXXX

আমি এমন একটি সম্পাদনা করেছি যা প্রশ্নটি উল্লেখযোগ্যভাবে সরল করে তবে এটি করার মাধ্যমে, এই উত্তরটিকে বাছাই করে invalid এটির জন্য দুঃখিত, তবে আমি অনুভব করেছি যে এটি সামগ্রিকভাবে বৃহত্তর ভালোর জন্য।
মার্ক আমেরিকা

-1

যদি আমি সঠিকভাবে বুঝতে পারি তবে আপনি বিল্ডিং তালিকায় যে ধরণের (চর মান) সংরক্ষণ করেন তা আপনার বিল্ডিং স্ট্যাটাস তালিকায় সঞ্চিত ধরণের (এনাম) তে রূপান্তর করতে হবে।

(বিল্ডিং তালিকার প্রতিটি চরিত্রের জন্য // চরিত্রের মান //, স্থিতি বিল্ডিং স্ট্যাটাস তালিকায় বিদ্যমান আছে // এনাম মান //)

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry,  
IList<BuildingStatuses> buildingStatus) 
{ 
    return from v in qry
           where ContainsStatus(v.Status)
           select v;
} 


private bool ContainsStatus(v.Status)
{
    foreach(Enum value in Enum.GetValues(typeof(buildingStatus)))
    {
        If v.Status == value.GetCharValue();
            return true;
    }

    return false;
}

-1; প্রশ্নটিতে আমার সম্পাদনাটি প্রশ্ন Buildingথেকে সমস্ত রেফারেন্স সরিয়ে এই উত্তরটিকে কিছুটা অকার্যকর করেছে , এটি ইতিমধ্যে সত্যই ভেঙে গেছেforeach(Enum value in Enum.GetValues(typeof(buildingStatus)))বাজে কথা।
মার্ক আমেরিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.