টেবিলের একমাত্র ক্ষেত্রের ভিত্তিতে লিন্কে আলাদা


133

আমি টেবিলের একটি ক্ষেত্রের উপর ভিত্তি করে ফলাফল পেতে লিন্কে .distinct ব্যবহার করার চেষ্টা করছি (সুতরাং টেবিল থেকে পুরো নকল রেকর্ডের প্রয়োজন হবে না)।

আমি নীচে পৃথক ব্যবহার করে বেসিক কোয়েরি লিখতে জানি:

var query = (from r in table1
orderby r.Text
select r).distinct();

তবে আমার r.textএমন ফলাফল দরকার যেখানে ডুপ্লিকেট করা হয়নি।


আপনি কোন ক্ষেত্রটি আলাদা হতে চান তা নির্দিষ্ট করতে হবে, দেখুন msdn.microsoft.com/en-us/library/bb348436.aspx
এন্টার বাইার্ড

উত্তর:


300

এটা চেষ্টা কর:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

এটি টেবিলকে দলবদ্ধ করবে Textএবং প্রতিটি গ্রুপ থেকে প্রথম সারি ব্যবহার করবে যার ফলস্বরূপ সারিগুলি Textপৃথক হবে।


2
যদি গ্রুপবাইয়ের 1 টির বেশি ক্ষেত্র থাকে?

6
@ user585440: সেক্ষেত্রে আপনি এমন একটি table1.GroupBy(x => new { x.Text, x.Property2, x.Property3 }).Select(x => x.First());
বেনাম

2
হ্যাঁ, আপনি ঠিক বলেছেন এবং আমি এটি ইতিমধ্যে খুঁজে পেয়েছি। যাই হোক ধন্যবাদ. এবং আমি এটিও দেখতে পেলাম যে নির্বাচন (x => x. প্রথম) ()) ক্রাশের কারণ হতে পারে। সিলেক্ট (x => x.FirstOrDefault ()) এ পরিবর্তন করা ভাল;

6
আমাকে ফার্স্টআরডিফল্টটি ব্যবহার করতে হবে অন্যথায় একটি রানটাইম ত্রুটি হয়েছিল
সত্যআফ 42

2
পছন্দ করেছেন GroupByখালি গোষ্ঠী তৈরি করে না, আমার আগের মন্তব্য দেখুন। সম্ভবত, আপনার কোডটিতে আপনি এখানে যা দেখেন তার চেয়ে বেশি রয়েছে। হতে পারে আপনার কাছে Whereপাশাপাশি বা একটি শর্তও রয়েছে First
ড্যানিয়েল হিলগারথ

26

মোরলিংকের একটি পৃথক পৃথক পদ্ধতি রয়েছে যা আপনি ব্যবহার করতে পারেন:

এটি আপনাকে করতে দেয়:

var results = table1.DistictBy(row => row.Text);

পদ্ধতিটির প্রয়োগ (যুক্তি বৈধতার সংক্ষিপ্ত) নিম্নরূপ:

private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
    HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
    foreach (TSource element in source)
    {
        if (knownKeys.Add(keySelector(element)))
        {
            yield return element;
        }
    }
}

দুঃখিত আমি সমতা কম্পিউটার ব্যবহার করতে আগ্রহী নই।
মেঘা জৈন

@ মেঘজাইন ওয়েল, যে কোনও একটি নির্বিশেষে ব্যবহার করা হবে, যেমনটি GroupByপ্রয়োজনও প্রয়োজন। EqualityComparerকোনও সরবরাহ না করা থাকলে উভয় পদ্ধতিই ডিফল্ট ব্যবহার করবে ।
14:39

9
ঠিক আছে, আমি ভুল হলে আমাকে সংশোধন করুন, তবে এই স্বতন্ত্রতা এখানে ডিবিতে নয়, স্মৃতিতে করা হয়? এটি কি অনাকাঙ্ক্ষিত পূর্ণ-স্ক্যানের দিকে যেতে পারে না?
কেক

@Kek। না, ফলন ফেরতের কারণে আপনি প্রথম স্বতন্ত্র উপাদানটিতে থামবেন। অবশেষে, হ্যাঁ, আপনি প্রতিটি কী হ্যাশসেটে লোড করবেন, তবে এটি যেহেতু অনুমিত এবং আইনিউমারেবল আউট, আপনি কেবল সেই আইটেমগুলি পাবেন। আপনি যদি লিনকিউ থেকে এসকিউএল সম্পর্কে কথা বলছেন তবে হ্যাঁ, এটি একটি টেবিল স্ক্যান করবে।
PRMan

12

তবে আমার এমন ফলাফলের দরকার যেখানে r.text সদৃশ নয়

মনে হচ্ছে আপনি এটি চান:

table1.GroupBy(x => x.Text)
      .Where(g => g.Count() == 1)
      .Select(g => g.First());

এটি সারিগুলি নির্বাচন করবে যেখানে Textঅনন্য।



3

এই বিষয়টি নিয়ে প্রচুর আলোচনা রয়েছে।

আপনি তাদের মধ্যে একটি এখানে পেতে পারেন :

সর্বাধিক জনপ্রিয় পরামর্শগুলির মধ্যে একটি হ'ল @ সার্ভে উল্লেখ করেছেন যে প্যারামিটার হিসাবে ল্যাম্বডা এক্সপ্রেশনটি গ্রহণ করা বিচ্ছিন্ন পদ্ধতি।

সি # এর প্রধান স্থপতি আন্ডারস হিজলসবার্গ এখানে সমাধানটির পরামর্শ দিয়েছেন । ফ্রেমওয়ার্ক ডিজাইন টিম কেন একটি ল্যাম্বদা লাগে ডিস্টিন্ট পদ্ধতির একটি ওভারলোড যুক্ত না করার সিদ্ধান্ত নিয়েছে তাও ব্যাখ্যা করছি।


2

আমি যা পেয়েছি তা থেকে, আপনার ক্যোয়ারী বেশিরভাগ ক্ষেত্রেই সঠিক। কেবল "সিলেক্ট আর" কে "সিলেক্ট আর.টেক্সট" এ পরিবর্তন করুন এবং সমস্যাটি সমাধান করা উচিত। এমএসডিএন কীভাবে এটি কাজ করা উচিত তা নথিভুক্ত করে।

উদা:

    var query = (from r in table1 orderby r.Text select r.Text).distinct();

আপনি "নির্বাচন করুন" বিবৃতিটি পরিবর্তন করেছেন যা এই ক্ষেত্রে পছন্দসই নয়
ফাজা

1
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });

-2

এই কোড চেষ্টা করুন:

table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());

-5

আপনি এটি চেষ্টা করতে পারেন:table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();

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