অবজেক্টের তালিকা থেকে স্বতন্ত্র ক্ষেত্রের মানগুলি ফিরিয়ে আনতে লিনকি ক্যোয়ারী


91
class obj
{
    int typeId; //10 types  0-9 
    string uniqueString; //this is unique
}

ধরুন 100 টি উপাদানের সাথে তালিকা রয়েছে তবে কেবল 10 টি অনন্য টাইপআইডি রয়েছে।
একটি লিনকিউ কোয়েরি লিখতে কি আপত্তিগুলির তালিকা থেকে 10 টি অনন্য ইনট ফেরত দেওয়া সম্ভব?


এই প্রশ্নটি এত সহজ এবং অনুগ্রহের জন্য উপযুক্ত নয়।
চিন্তাবিদ

উত্তর:


157
objList.Select(o=>o.typeId).Distinct()

4
দ্বিতীয় ফর্মটি ডিস্টিন্টের একটি অতিরিক্ত বোঝা ব্যবহার করে বলে মনে হচ্ছে যা অবধি আমি অবগত নই।
জন স্কিটি

ওফস, দ্বিতীয়টি মুছে ফেলা হয়েছে, @ জোন স্কিটিকে ধন্যবাদ, যা আইক্যুয়ালিটি কম্পিউটারের সাথে করা যেতে পারে
আর্সেন

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

59

ধরে নিই যে আপনি সম্পূর্ণ অবজেক্টটি চান, তবে কেবল স্বতন্ত্রতার সাথেই বিষয়টি মোকাবেলা করতে চান typeID, এটি সহজ করার জন্য লিনকিউতে কিছুই তৈরি করা নেই। (আপনি যদি শুধু চান typeID- যে সঙ্গে প্রকল্পের মান, এটি সহজ Selectএবং তারপর স্বাভাবিক ব্যবহারের Distinctকল।)

ইন MoreLINQ আমরা আছে DistinctByঅপারেটর যা আপনি ব্যবহার করতে পারে:

var distinct = list.DistinctBy(x => x.typeID);

এটি কেবলমাত্র লিনকিউ থেকে অবজেক্টের পক্ষে কাজ করে।

আপনি একটি গোষ্ঠীকরণ বা চেহারা ব্যবহার করতে পারেন, এটি কিছুটা বিরক্তিকর এবং অদক্ষ:

var distinct = list.GroupBy(x => x.typeID, (key, group) => group.First());


4
@ শীল: না, আমি মোড়লিংকিউ-তে ডিস্টিন্ট বাই সম্পর্কে লিখছিলাম। মাইক্রোসফ্ট.আজাক্স. ইউটিলিটিসের সাথে কিছুই করার নেই।
জন স্কিটে

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

4
@ দিপেনডুপল: হ্যাঁ, তবে তার অর্থ এখনও একটি প্রদত্ত সম্পত্তির জন্য সমতা তুলক তৈরি করা, যা বিরক্তিকর এবং এটি পড়তে আরও কঠিন করে তোলে। আপনি যদি মোরেলিংকিউ নির্ভরতা নিতে পারেন তবে আমার ধারণা এটি পরিষ্কার।
জন স্কিটি

26

যদি কেবল খাঁটি লিনক ব্যবহার করতে চান তবে আপনি গ্রুপবাই ব্যবহার করতে পারেন:

List<obj> distinct =
  objs.GroupBy(car => car.typeID).Select(g => g.First()).ToList();

আপনি যদি অ্যাপ্লিকেশন জুড়ে কোনও পদ্ধতি ব্যবহার করতে চান তবে মোর লিনিকের মতো :

public static IEnumerable<TSource> DistinctBy<TSource, TKey>
    (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
    HashSet<TKey> seenKeys = new HashSet<TKey>();
    foreach (TSource element in source)
    {
        if (!seenKeys.Contains(keySelector(element)))
        {
            seenKeys.Add(keySelector(element));
            yield return element;
        }
    }
}

কেবল আইডি সম্পত্তি ব্যবহার করে স্বতন্ত্র মানগুলি খুঁজে পেতে এই পদ্ধতিটি ব্যবহার করে আপনি ব্যবহার করতে পারেন:

var query = objs.DistinctBy(p => p.TypeId);

আপনি একাধিক বৈশিষ্ট্য ব্যবহার করতে পারেন:

var query = objs.DistinctBy(p => new { p.TypeId, p.Name });

একাধিক সম্পত্তি অংশের জন্য ধন্যবাদ !
Nae থেকে

7

অবশ্যই, ব্যবহার Enumerable.Distinct

obj(উদাঃ foo) এর সংগ্রহ দেওয়া , আপনি এরকম কিছু করতে চাইবেন:

var distinctTypeIDs = foo.Select(x => x.typeID).Distinct();

5

আমি মনে করি এটিই আপনার সন্ধান করছেন:

    var objs= (from c in List_Objects 
orderby c.TypeID  select c).GroupBy(g=>g.TypeID).Select(x=>x.FirstOrDefault());      

এই কি LINQ এর সাথে আলাদা করে আইকোয়্যারেবল ফিরিয়ে দেওয়ার মতো?


.Firstঠিক আছে, যেহেতু গ্রুপটিতে কিছু না থাকলে আপনার গ্রুপটি থাকত না।
এমকিপিপি

4
GroupByএটিকে আরও সহজ করতে আপনি বিকল্প ওভারলোড ব্যবহার করতে পারেন - উদাহরণের জন্য আমার উত্তর দেখুন।
জন স্কিটি

3

যদি কেবল লিনক ব্যবহার করতে চান তবে আপনি সমান এবং গেটহ্যাশকোড পদ্ধতিগুলিকে ওভাররাইড করতে পারেন ।

পণ্য শ্রেণি:

public class Product
{
    public string ProductName { get; set; }
    public int Id { get; set; }


    public override bool Equals(object obj)
    {
        if (!(obj is Product))
        {
            return false;
        }

        var other = (Product)obj;
        return Id == other.Id;
    }

    public override int GetHashCode()
    {
        return Id.GetHashCode();
    }
}

প্রধান পদ্ধতি:

static void Main(string[] args)
    {

        var products = new List<Product>
        {
            new Product{ ProductName="Product 1",Id = 1},
            new Product{ ProductName="Product 2",Id = 2},
            new Product{ ProductName="Product 4",Id = 5},
            new Product{ ProductName="Product 3",Id = 3},
            new Product{ ProductName="Product 4",Id = 4},
            new Product{ ProductName="Product 6",Id = 4},
            new Product{ ProductName="Product 6",Id = 4},
        };

        var itemsDistinctByProductName = products.Distinct().ToList();

        foreach (var product in itemsDistinctByProductName)
        {
            Console.WriteLine($"Product Id : {product.Id} ProductName : {product.ProductName} ");
        }

        Console.ReadKey();
    }

1

আমি একটি নির্দিষ্ট ডেটা ড্রপডাউনে বাঁধতে চেয়েছিলাম এবং এটি পৃথক হওয়া উচিত। আমি নিম্নলিখিতগুলি করেছি:

List<ClassDetails> classDetails;
List<string> classDetailsData = classDetails.Select(dt => dt.Data).Distinct.ToList();
ddlData.DataSource = classDetailsData;
ddlData.Databind();

এটি সাহায্য করে কিনা দেখুন

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