ন্যূনতম বা সর্বাধিক সম্পত্তি মান সহ অবজেক্ট নির্বাচন করতে কীভাবে LINQ ব্যবহার করবেন


464

আমার নূন্যতম তারিখের জন্মের সম্পত্তি সহ একজন ব্যক্তির অবজেক্ট রয়েছে। প্রাথমিক / ক্ষুদ্রতম তারিখের জন্ম তারিখের সাথে একের জন্য ব্যক্তির সামগ্রীর তালিকাকে জিজ্ঞাসা করার জন্য লিনকিউ ব্যবহার করার কোনও উপায় আছে কি?

আমি যা দিয়ে শুরু করেছি তা এখানে:

var firstBornDate = People.Min(p => p.DateOfBirth.GetValueOrDefault(DateTime.MaxValue));

ন্যূন তারিখপথের জন্মের মানগুলি ন্যূনতম বিবেচনার বাইরে চলে যাওয়ার জন্য ডেটটাইম.ম্যাক্সভ্যালুতে সেট করা হয়েছে (ধরে নেওয়া যাক কমপক্ষে একটিতে নির্দিষ্ট ডিওবি রয়েছে))

তবে আমার পক্ষে যা হয় তা হ'ল ফার্স্টবার্নেটকে একটি ডেটটাইম মানতে সেট করা। আমি যেটি পেতে চাই তা হ'ল সেই ব্যক্তির অবজেক্ট যা এর সাথে মেলে। আমাকে কি দ্বিতীয় কোয়ের মতো লিখতে হবে:

var firstBorn = People.Single(p=> (p.DateOfBirth ?? DateTime.MaxValue) == firstBornDate);

বা এটি করার একটি ঝুঁকির উপায় আছে?


24
আপনার উদাহরণে কেবল একটি মন্তব্য: আপনার এখানে সম্ভবত সিঙ্গল ব্যবহার করা উচিত নয়। দু'জনের মধ্যে একই তারিখের জন্ম থাকলে এটি ব্যতিক্রম হবে
নিকি

1
প্রায় ডুপ্লিকেট স্ট্যাকওভারফ্লো.com / প্রশ্নগুলি / ২73736২৩66/২ দেখুন , যার কয়েকটি সংক্ষিপ্ত উদাহরণ রয়েছে।
গুদেডে

4
কি একটি সহজ এবং দরকারী বৈশিষ্ট্য। MinBy স্ট্যান্ডার্ড লাইব্রেরিতে থাকা উচিত। আমাদের মাইক্রোসফ্ট github.com
কর্নেল প্যানিক

2
এটি আজ উপস্থিত বলে মনে হচ্ছে, কেবল সম্পত্তি বাছাইয়ের জন্য একটি ফাংশন সরবরাহ করুন:a.Min(x => x.foo);
জ্যাকমট ২

4
সমস্যাটি দেখানোর জন্য: পাইথনে, max("find a word of maximal length in this sentence".split(), key=len)স্ট্রিংটি 'বাক্য' প্রদান করে। C # "find a word of maximal length in this sentence".Split().Max(word => word.Length)হিসাব করে 8 কোন শব্দ দীর্ঘতম দৈর্ঘ্য হল, কিন্তু কি তোমাদেরকে বলিনি কী দীর্ঘতম শব্দ হয়
কর্নেল আতঙ্ক

উত্তর:


297
People.Aggregate((curMin, x) => (curMin == null || (x.DateOfBirth ?? DateTime.MaxValue) <
    curMin.DateOfBirth ? x : curMin))

16
কেবলমাত্র আইকোম্যাপারেবল প্রয়োগ এবং মিন (বা লুপের জন্য) ব্যবহারের চেয়ে সম্ভবত কিছুটা ধীর। তবে ও (এন) লিনকি সমাধানের জন্য +1।
ম্যাথু ফ্ল্যাশেন

3
এছাড়াও, এটি <কারমিন.ডেটঅফবার্থ হওয়া দরকার। অন্যথায়, আপনি একটি ব্যক্তির সাথে একটি ডেটটাইম তুলনা করছেন।
ম্যাথু ফ্ল্যাশেন

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

8
অতিমাত্রায় চেক curMin == nullকরছ কেন ? আপনি যদি এমন একটি বীজ ব্যবহার করেন curMinতবেই তা হতে পারে । nullAggregate()null
গুড নাইট নার্ড অহংকার


226

দুর্ভাগ্যক্রমে এটি করার জন্য অন্তর্নির্মিত পদ্ধতি নেই, তবে এটি নিজের জন্য বাস্তবায়নের পক্ষে যথেষ্ট সহজ। এখানে এর সাহস আছে:

public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector)
{
    return source.MinBy(selector, null);
}

public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
    Func<TSource, TKey> selector, IComparer<TKey> comparer)
{
    if (source == null) throw new ArgumentNullException("source");
    if (selector == null) throw new ArgumentNullException("selector");
    comparer = comparer ?? Comparer<TKey>.Default;

    using (var sourceIterator = source.GetEnumerator())
    {
        if (!sourceIterator.MoveNext())
        {
            throw new InvalidOperationException("Sequence contains no elements");
        }
        var min = sourceIterator.Current;
        var minKey = selector(min);
        while (sourceIterator.MoveNext())
        {
            var candidate = sourceIterator.Current;
            var candidateProjected = selector(candidate);
            if (comparer.Compare(candidateProjected, minKey) < 0)
            {
                min = candidate;
                minKey = candidateProjected;
            }
        }
        return min;
    }
}

ব্যবহারের উদাহরণ:

var firstBorn = People.MinBy(p => p.DateOfBirth ?? DateTime.MaxValue);

নোট করুন যে অনুক্রমটি খালি থাকলে এটি একটি ব্যতিক্রম ছুঁড়ে ফেলবে, এবং একাধিকের বেশি থাকলে সর্বনিম্ন মান সহ প্রথম উপাদানটি ফিরিয়ে দেবে ।

অন্যথা, আপনি বাস্তবায়ন আমরা পেয়েছেন ব্যবহার করতে পারেন MoreLINQ এ, MinBy.cs । ( MaxByঅবশ্যই একটি অনুরূপ আছে ।)

প্যাকেজ ম্যানেজার কনসোলের মাধ্যমে ইনস্টল করুন:

প্রধানমন্ত্রী> ইনস্টল-প্যাকেজ মোড়লিঙ্ক


1
আমি ভবিষ্যতবাণী করার সময় আইয়েনোমিটার + প্রতিস্থাপন করব
ggf31416

5
লুপের আগে মুভনেক্সট () এ প্রথম কল করার কারণে এটি সহজেই করা যায় না। বিকল্প রয়েছে, তবে তারা মেসিওয়ার আইএমও।
জন স্কিটি

2
আমি যখন পারে ডিফল্ট (টি) যে আমার কাছে অনুপযুক্ত মনে ফিরে যান। এটি ফার্স্ট () এর মতো পদ্ধতির সাথে এবং অভিধান সূচকটির পদ্ধতির সাথে আরও সুসংগত। আপনি চাইলেও সহজেই এটিকে মানিয়ে নিতে পারতেন।
জন স্কিটি

8
আমি লাইব্রেরিহীন সমাধানের কারণে পলকে উত্তরটি দিয়েছি, তবে এই কোডটির জন্য ধন্যবাদ এবং মোরলিংকিউ লাইব্রেরির লিঙ্কটির জন্য ধন্যবাদ, যা আমি মনে করি আমি ব্যবহার শুরু করব!
স্লাইফ

1
@ হামিশগ্রুবিজান: থ্রোহেল্পার: কোড. google.com/p/morelinq/source/browse/MoreLinq/…
জন স্কিটি

135

দ্রষ্টব্য: আমি এই উত্তরটিকে সম্পূর্ণতার জন্য অন্তর্ভুক্ত করছি যেহেতু ওপি ডেটা উত্সটি কী তা উল্লেখ করে না এবং আমাদের কোনও অনুমান করা উচিত নয়।

এই ক্যোয়ারীটি সঠিক উত্তর দেয় তবে ধীরে ধীরে হতে পারে যেহেতু এটিতে ডেটা স্ট্রাকচার কী তার উপর নির্ভর করে সমস্ত আইটেমগুলিতে বাছাই করতে পারে :PeoplePeople

var oldest = People.OrderBy(p => p.DateOfBirth ?? DateTime.MaxValue).First();

আপডেট: আসলে আমার এই সমাধানটিকে "নিষ্পাপ" না বলা উচিত, তবে ব্যবহারকারীর জানা দরকার যে তিনি কীসের বিরুদ্ধে অনুসন্ধান করছেন। এই সমাধানটির "স্বচ্ছলতা" অন্তর্নিহিত ডেটার উপর নির্ভর করে। এটি যদি একটি অ্যারে হয় List<T>তবে প্রথম আইটেমটি নির্বাচনের আগে সম্পূর্ণ সংগ্রহটি প্রথমে বাছাই করা ছাড়া অবজেক্টের কাছে লিনকিউ-র কোনও বিকল্প নেই। এক্ষেত্রে এটি প্রস্তাবিত অন্যান্য সমাধানের চেয়ে ধীর হবে। তবে, যদি এটি এসকিউএল টেবিলের একটি লিনকিউ হয় এবং DateOfBirthএটি একটি সূচকযুক্ত কলাম হয়, তবে এসকিউএল সার্ভার সমস্ত সারি বাছাইয়ের পরিবর্তে সূচকটি ব্যবহার করবে। অন্যান্য কাস্টম IEnumerable<T>বাস্তবায়নগুলি সূচকগুলিও ব্যবহার করতে পারে ( i4o: সূচী লিনকিউ , অথবা অবজেক্ট ডাটাবেস db4o ) এবং এই সমাধানটি আরও Aggregate()বা MaxBy()/MinBy()যা একবারে পুরো সংগ্রহ পুনরাবৃত্তি করা প্রয়োজন। প্রকৃতপক্ষে, লিনক টু অবজেক্টস (তত্ত্বের ভিত্তিতে) এর মতো OrderBy()বাছাই করা সংগ্রহের ক্ষেত্রে বিশেষ মামলা করতে পারে SortedList<T>, তবে যতদূর আমি জানি এটি তা নয়।


1
কেউ ইতিমধ্যে এটি পোস্ট করেছেন, তবে আমি কতটা ধীর (এবং স্থান গ্রহণকারী) এটি (ও (এন লগ এন) মিনিটের জন্য ও (এন) এর তুলনায় সর্বোত্তমভাবে গতি ছিল) বলে মন্তব্য করার পরে দৃশ্যত এটি মুছে ফেলা হয়েছে। :)
ম্যাথু ফ্ল্যাশেন

হ্যাঁ, অতএব নিষ্পাপ সমাধান হিসাবে আমার সতর্কতা :) তবে এটি মৃত সহজ এবং কিছু ক্ষেত্রে ব্যবহারযোগ্য হতে পারে (ছোট সংগ্রহ বা যদি ডেটঅফবার্থ একটি সূচকযুক্ত ডিবি কলাম হয়)
লুকাস

অন্য একটি বিশেষ কেস (যা সেখানে নেই) হ'ল অর্ডারবাইয়ের জ্ঞান ব্যবহার করা এবং প্রথমে বাছাই না করে সর্বনিম্ন মান অনুসন্ধান করা সম্ভব হবে।
রুন এফএস

সংগ্রহ বাছাই করা হল এনলগ (এন) ক্রিয়া যা লিনিয়ার বা ও (এন) সময়ের জটিলতার চেয়ে ভাল নয়। যদি আমাদের সিকোয়েন্স থেকে কেবল 1 এলিমেন্ট / অবজেক্টের প্রয়োজন হয় যা সর্বনিম্ন বা সর্বাধিক হয় তবে আমি মনে করি আমাদের লিনিয়ার সময় কমপ্লিটের সাথে লেগে থাকা উচিত।
ইয়াওয়ার মুর্তজা

@ ইয়াওয়ার সংগ্রহটি ইতিমধ্যে বাছাই করা হতে পারে (আরও সম্ভাব্য সূচিকৃত) যে ক্ষেত্রে আপনি ও (লগ এন) রাখতে পারেন
রুন এফএস

63
People.OrderBy(p => p.DateOfBirth.GetValueOrDefault(DateTime.MaxValue)).First()

কৌতুক করবে


1
এই এক মহান! আমি অর্ডারবাইডিজেন্ডিং (...) দিয়েছিলাম (আমার লিঙ্ক প্রজেশন ক্ষেত্রে (1) নিন।
বেদরান মান্দিć

1
এটি একটি বাছাই ব্যবহার করে যা ও (এন) সময়ের চেয়ে বেশি এবং ও (এন) মেমরি ব্যবহার করে।
জর্জ পোলেভয়

@ জর্জিপোলভয় যা ধরে নিয়েছে যে আমরা ডেটা উত্স সম্পর্কে অনেক কিছু জানি। যদি ডেটা উত্সটিতে প্রদত্ত ক্ষেত্রটিতে ইতিমধ্যে একটি সাজানো সূচক রয়েছে, তবে এটি একটি (কম) ধ্রুবক হবে এবং এটি গ্রহণযোগ্য উত্তরের চেয়ে অনেক দ্রুত হবে যা পুরো তালিকাটিকে অনুসরণ করতে হবে to অন্যদিকে ডেটা উত্স যদি উদাহরণস্বরূপ একটি অ্যারে হয় তবে অবশ্যই আপনি ঠিক আছেন
রুন এফএস

@ রুনএফএস - এখনও আপনার জবাবটি উল্লেখ করা উচিত কারণ এটি গুরুত্বপূর্ণ।
rory.ap

পারফরম্যান্স আপনাকে নীচে টেনে আনবে। আমি এটা হার্ড উপায় শিখেছি। আপনি যদি ন্যূনতম বা সর্বোচ্চ মান সহ অবজেক্টটি চান তবে আপনাকে পুরো অ্যারে বাছাই করতে হবে না। মাত্র 1 স্ক্যান যথেষ্ট হওয়া উচিত। গৃহীত উত্তরটি দেখুন বা মোর লিংক প্যাকেজটি দেখুন।
Sau001

35

সুতরাং আপনি চাইছেন ArgMinবাArgMax । সি # এর জন্য বিল্ট-ইন এপিআই নেই।

আমি এটি করার জন্য একটি পরিষ্কার এবং দক্ষ (সময়ে (ও)) উপায় খুঁজছি। এবং আমি মনে করি আমি এটি একটি পেয়েছি:

এই প্যাটার্নটির সাধারণ ফর্মটি হ'ল:

var min = data.Select(x => (key(x), x)).Min().Item2;
                            ^           ^       ^
              the sorting key           |       take the associated original item
                                Min by key(.)

বিশেষত, মূল প্রশ্নের উদাহরণ ব্যবহার করে:

সি # 7.0 এবং তার চেয়েও উপরে যা মান টিউপলকে সমর্থন করে :

var youngest = people.Select(p => (p.DateOfBirth, p)).Min().Item2;

#.০ এর আগে সি # সংস্করণের জন্য, বেনামে প্রকারের পরিবর্তে ব্যবহার করা যেতে পারে:

var youngest = people.Select(p => new { ppl = p; age = p.DateOfBirth }).Min().ppl;

তারা কাজ কারণ উভয় মান tuple এবং বেনামী টাইপ যুক্তিসম্মত ডিফল্ট comparers আছে: (X1, Y1) এবং (x2, Y2) জন্য, এটি প্রথমে তুলনা x1বনাম x2, তারপর y1বনাম y2। সে কারণেই বিল্ট-ইন .Minএই ধরণের ব্যবহার করা যেতে পারে।

এবং যেহেতু বেনামে টাইপ এবং মান উভয়ই মান ধরণের, তাই উভয়ই খুব দক্ষ হওয়া উচিত।

বিঃদ্রঃ

আমার উপরোক্ত ArgMinবাস্তবায়নগুলিতে আমি সরলতা এবং স্পষ্টতার জন্য DateOfBirthধরণ গ্রহণ করেছি DateTime। আসল প্রশ্নটি শূন্য DateOfBirthক্ষেত্র সহ এন্ট্রিগুলি বাদ দিতে বলে :

ন্যূন তারিখপথের জন্মের মানগুলি ন্যূনতম বিবেচনার বাইরে চলে যাওয়ার জন্য ডেটটাইম.ম্যাক্সভ্যালুতে সেট করা হয়েছে (ধরে নেওয়া যাক কমপক্ষে একটিতে নির্দিষ্ট ডিওবি রয়েছে))

এটি প্রাক-ফিল্টারিংয়ের মাধ্যমে অর্জন করা যেতে পারে

people.Where(p => p.DateOfBirth.HasValue)

সুতরাং এটি বাস্তবায়নের প্রশ্নে ArgMinবা নিরপেক্ষ ArgMax

দ্রষ্টব্য 2

উপরোক্ত পদ্ধতির একটি সতর্কতা রয়েছে যে যখন দুটি উদাহরণ রয়েছে যখন একই ন্যূনতম মান হয়, তখন Min()বাস্তবায়নটি উদাহরণগুলি টাই-ব্রেকার হিসাবে তুলনা করার চেষ্টা করবে। তবে, উদাহরণগুলির শ্রেণি যদি প্রয়োগ না করে IComparableতবে একটি রানটাইম ত্রুটি নিক্ষেপ করা হবে:

কমপক্ষে একটি অবজেক্ট অবশ্যই আইকোম্যাপারেবল প্রয়োগ করতে হবে

ভাগ্যক্রমে, এটি এখনও পরিষ্কারভাবে স্থির করা যেতে পারে। ধারণাটি হ'ল প্রতিটি প্রবেশের সাথে একটি দূরত্ব "আইডি" যুক্ত করে যা দ্ব্যর্থহীন টাই-ব্রেকার হিসাবে কাজ করে। আমরা প্রতিটি প্রবেশের জন্য একটি ইনক্রিমেন্টাল আইডি ব্যবহার করতে পারি। এখনও উদাহরণ হিসাবে মানুষ বয়সের ব্যবহার:

var youngest = Enumerable.Range(0, int.MaxValue)
               .Zip(people, (idx, ppl) => (ppl.DateOfBirth, idx, ppl)).Min().Item3;

1
যখন মান টাইপটি বাছাই করা কী তখন এটি কাজ করে না বলে মনে হয়। "কমপক্ষে একটি অবজেক্ট অবশ্যই আইকোম্যাপারেবল বাস্তবায়ন করবে"
লিয়াং

1
খুব দুর্দান্ত! এটি সেরা উত্তর হওয়া উচিত।
গুইডো মোচা

@ লাইয়ানং হ্যাঁ ভাল ক্যাচ ভাগ্যক্রমে এখনও এর একটি পরিষ্কার সমাধান আছে। "নোট 2" বিভাগে আপডেট হওয়া সমাধানটি দেখুন।
কেএফএল

নির্বাচন করুন আপনি আইডি দিতে পারেন! var কনিষ্ঠ = মানুষ e নির্বাচন করুন ((পি, আই) => (পি। ডেটঅফবার্থ, আই, পি)) ন্যূনতম ()। আইটেম 2;
জেরেমি

19

অতিরিক্ত প্যাকেজ ছাড়াই সমাধান:

var min = lst.OrderBy(i => i.StartDate).FirstOrDefault();
var max = lst.OrderBy(i => i.StartDate).LastOrDefault();

এছাড়াও আপনি এটিকে এক্সটেনশনে গুটিয়ে রাখতে পারেন:

public static class LinqExtensions
{
    public static T MinBy<T, TProp>(this IEnumerable<T> source, Func<T, TProp> propSelector)
    {
        return source.OrderBy(propSelector).FirstOrDefault();
    }

    public static T MaxBy<T, TProp>(this IEnumerable<T> source, Func<T, TProp> propSelector)
    {
        return source.OrderBy(propSelector).LastOrDefault();
    }
}

এবং এই ক্ষেত্রে:

var min = lst.MinBy(i => i.StartDate);
var max = lst.MaxBy(i => i.StartDate);

যাইহোক ... O (n ^ 2) সেরা সমাধান নয়। পল বেটস আমার চেয়ে দ্রুততর সমাধান দিয়েছেন solution তবে আমার এখনও লিনকিউ সমাধান এবং এটি অন্যান্য সমাধানগুলির চেয়ে আরও সহজ এবং আরও সংক্ষিপ্ত।


3
public class Foo {
    public int bar;
    public int stuff;
};

void Main()
{
    List<Foo> fooList = new List<Foo>(){
    new Foo(){bar=1,stuff=2},
    new Foo(){bar=3,stuff=4},
    new Foo(){bar=2,stuff=3}};

    Foo result = fooList.Aggregate((u,v) => u.bar < v.bar ? u: v);
    result.Dump();
}

3

সামগ্রিকভাবে পুরোপুরি সাধারণ ব্যবহার (অন্যান্য ভাষায় ভাঁজ করার সমতুল্য):

var firstBorn = People.Aggregate((min, x) => x.DateOfBirth < min.DateOfBirth ? x : min);

একমাত্র ক্ষতিটি হ'ল সম্পত্তিটি ক্রম উপাদান অনুসারে দু'বার অ্যাক্সেস করা হয় যা ব্যয়বহুল হতে পারে। এটা ঠিক করা কঠিন।


1

নিম্নলিখিত আরও জেনেরিক সমাধান। এটি মূলত একই জিনিসটি (ও (এন) ক্রমে) করে তবে যে কোনও আইনাম্বারেবল ধরণের ক্ষেত্রে এবং এমন প্রকারের সাথে মিশ্রিত করতে পারে যার সম্পত্তি নির্বাচনকারীরা বাতিল করতে পারে।

public static class LinqExtensions
{
    public static T MinBy<T>(this IEnumerable<T> source, Func<T, IComparable> selector)
    {
        if (source == null)
        {
            throw new ArgumentNullException(nameof(source));
        }
        if (selector == null)
        {
            throw new ArgumentNullException(nameof(selector));
        }
        return source.Aggregate((min, cur) =>
        {
            if (min == null)
            {
                return cur;
            }
            var minComparer = selector(min);
            if (minComparer == null)
            {
                return cur;
            }
            var curComparer = selector(cur);
            if (curComparer == null)
            {
                return min;
            }
            return minComparer.CompareTo(curComparer) > 0 ? cur : min;
        });
    }
}

পরীক্ষা:

var nullableInts = new int?[] {5, null, 1, 4, 0, 3, null, 1};
Assert.AreEqual(0, nullableInts.MinBy(i => i));//should pass

0

আবার সম্পাদনা করুন:

দুঃখিত। শূন্যস্থানটি মিস করার পাশাপাশি আমি ভুল ফাংশনটি দেখছিলাম,

ন্যূনতম <(অফ <(টিসোর্স, ট্রসাল্ট>))>) (অনুমানযোগ্য <(এর <(টিসোর্স>)>)), ফানক <(টি (উত্স (টিসোর্স, ট্রান্সল্ট>)>))) আপনি যেমন বলেছিলেন ফলাফলের প্রকার ফেরত দেয় না।

আমি বলব একটি সম্ভাব্য সমাধান হ'ল আইকোম্যাপারেবল বাস্তবায়ন করা এবং ন্যূনতম <(অফ <(টিসোর্স>)>) (অনুমানযোগ্য <(এর <(টিএসফোর্স>)>)) ব্যবহার করা , যা প্রকৃতপক্ষে আইএনমেবল থেকে কোনও উপাদান ফেরত দেয়। অবশ্যই, যদি আপনি উপাদানটি সংশোধন করতে না পারেন তবে এটি আপনাকে সহায়তা করে না। আমি এখানে এমএসের ডিজাইনটি কিছুটা অদ্ভুত বলে মনে করি।

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


0

আর একটি বাস্তবায়ন, যা অযোগ্য নির্বাচনকারী কীগুলির সাথে কাজ করতে পারে এবং উপযুক্ত উপাদান না পাওয়া গেলে রেফারেন্স টাইপের রিটার্ন সংগ্রহের জন্য শূন্য হয়। এটি উদাহরণস্বরূপ ডাটাবেস ফলাফল প্রক্রিয়া করার পরে সহায়ক হতে পারে।

  public static class IEnumerableExtensions
  {
    /// <summary>
    /// Returns the element with the maximum value of a selector function.
    /// </summary>
    /// <typeparam name="TSource">The type of the elements of source.</typeparam>
    /// <typeparam name="TKey">The type of the key returned by keySelector.</typeparam>
    /// <param name="source">An IEnumerable collection values to determine the element with the maximum value of.</param>
    /// <param name="keySelector">A function to extract the key for each element.</param>
    /// <exception cref="System.ArgumentNullException">source or keySelector is null.</exception>
    /// <exception cref="System.InvalidOperationException">source contains no elements.</exception>
    /// <returns>The element in source with the maximum value of a selector function.</returns>
    public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) => MaxOrMinBy(source, keySelector, 1);

    /// <summary>
    /// Returns the element with the minimum value of a selector function.
    /// </summary>
    /// <typeparam name="TSource">The type of the elements of source.</typeparam>
    /// <typeparam name="TKey">The type of the key returned by keySelector.</typeparam>
    /// <param name="source">An IEnumerable collection values to determine the element with the minimum value of.</param>
    /// <param name="keySelector">A function to extract the key for each element.</param>
    /// <exception cref="System.ArgumentNullException">source or keySelector is null.</exception>
    /// <exception cref="System.InvalidOperationException">source contains no elements.</exception>
    /// <returns>The element in source with the minimum value of a selector function.</returns>
    public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector) => MaxOrMinBy(source, keySelector, -1);


    private static TSource MaxOrMinBy<TSource, TKey>
      (IEnumerable<TSource> source, Func<TSource, TKey> keySelector, int sign)
    {
      if (source == null) throw new ArgumentNullException(nameof(source));
      if (keySelector == null) throw new ArgumentNullException(nameof(keySelector));
      Comparer<TKey> comparer = Comparer<TKey>.Default;
      TKey value = default(TKey);
      TSource result = default(TSource);

      bool hasValue = false;

      foreach (TSource element in source)
      {
        TKey x = keySelector(element);
        if (x != null)
        {
          if (!hasValue)
          {
            value = x;
            result = element;
            hasValue = true;
          }
          else if (sign * comparer.Compare(x, value) > 0)
          {
            value = x;
            result = element;
          }
        }
      }

      if ((result != null) && !hasValue)
        throw new InvalidOperationException("The source sequence is empty");

      return result;
    }
  }

উদাহরণ:

public class A
{
  public int? a;
  public A(int? a) { this.a = a; }
}

var b = a.MinBy(x => x.a);
var c = a.MaxBy(x => x.a);

-2

আমি লাইব্রেরি ব্যবহার না করে বা পুরো তালিকাটি বাছাই না করে নিজের মতো করে কিছু সন্ধান করছি। আমার সমাধানটি প্রশ্নটির মতোই শেষ হয়েছিল, কিছুটা সহজ হয়েছে।

var firstBorn = People.FirstOrDefault(p => p.DateOfBirth == People.Min(p2 => p2.DateOfBirth));

আপনার লিনাক স্টেটমেন্টের আগে মিনিট পাওয়া কি আরও কার্যকর হবে না? var min = People.Min(...); var firstBorn = People.FirstOrDefault(p => p.DateOfBirth == min...অন্যথায় এটি আপনার সন্ধান করা সন্ধান না পাওয়া অবধি মিনিট বার হয়ে যাচ্ছে getting
নিমিনেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.