একটি কাস্টম শ্রেণীর তালিকা বাছাই করুন <টি>


112

আমি dateসম্পত্তি সাথে আমার তালিকাটি বাছাই করতে চাই ।

এটি আমার কাস্টম ক্লাস:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Test.Web
{
    public class cTag
    {
        public int id { get; set; }
        public int regnumber { get; set; }
        public string date { get; set; }
    }
}

এটি হ'ল Listআমি বাছাই করতে চাই:

List<cTag> Week = new List<cTag>();

আমি যা করতে চাই তা হল dateসিটিএগ ক্লাসের সম্পত্তি অনুসারে তালিকাটি বাছাই করা । ফর্ম্যাটে তারিখটি ist: dd.MM.yyyy।

আমি IComparableইন্টারফেস সম্পর্কে কিছু পড়েছি , তবে কীভাবে এটি ব্যবহার করতে হয় তা জানি না।

উত্তর:


143

এটি করার একটি উপায় হ'ল ক delegate

List<cTag> week = new List<cTag>();
// add some stuff to the list
// now sort
week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); });

98
আপনি একই জিনিসটি ল্যাম্বডা এক্সপ্রেশন দিয়েও লিখতে পারেন:list.Sort((a,b) => a.date.CompareTo(b.date));
জাভিয়ের পইনাস

2
@ জাভিয়ার কোনও কারণে আমার মন এখনও সর্বদা আগে পূর্বাভাসের দিকে ঝাঁপ দেয়, যদিও আপনি 100% সঠিক যে আপনার ল্যাম্বডা অভিব্যক্তিটি কাজটি করবে এবং সম্ভবত পড়তে / বুঝতে সহজ হবে।
আহসটিলে

এটি কীভাবে বা আপনি কীভাবে লম্বা এক্সপ্রেশন ব্যবহার করে ধারাবাহিকভাবে ব্রেক করবেন? এখানে যদি a.date == b.date হয়? list.Sort ((a, b) => a.date.CompareTo (b.date)); গ্রিডগুলির পেজিং করার সময় এবং এই দুটি ভিন্ন পৃষ্ঠায় পড়ার সময় এটি কী সমস্যার সৃষ্টি করবে?
TheEirOfGroofunkistan

1
@TheEirOfGroofunkistan যে সমস্ত কীভাবে CompareToপ্রয়োগ করা হয় তার উপর নির্ভর করে । IComparableকোন শ্রেণীর কাছে পদ্ধতি রয়েছে তা মঞ্জুরি দেয় তবে এটি কীভাবে তুলনা করে তা ক্লাস স্রষ্টার উপর নির্ভর করে। তারিখটি আইকম্পারকে কীভাবে প্রয়োগ করে তা নিশ্চিত নয়, তবে প্রায়শই আমি যখন দেখেছি বিকাশকারীরা মান সমান হয় তখন টাই ভাঙ্গতে অর্ডার পরামিতিগুলি ব্যবহার করা হয়। এইচটি
আহস্তিলে

51

আপনি সঠিক যে আপনার সিটি্যাগ ক্লাসটি অবশ্যই IComparable<T>ইন্টারফেস প্রয়োগ করবে । তারপরে আপনি কেবল Sort()আপনার তালিকায় কল করতে পারেন ।

IComparable<T>ইন্টারফেস বাস্তবায়নের জন্য , আপনাকে অবশ্যই CompareTo(T other)পদ্ধতি প্রয়োগ করতে হবে । এটি করার সবচেয়ে সহজ উপায়টি আপনি যে ক্ষেত্রটির সাথে তুলনা করতে চান তার তুলনা করার পদ্ধতিটি কল করুন যা আপনার ক্ষেত্রে তারিখ।

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public string date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

তবে এটি ভালভাবে সাজান না কারণ এটি স্ট্রিংগুলিতে ক্লাসিক বাছাই ব্যবহার করবে (যেহেতু আপনি তারিখটিকে স্ট্রিং হিসাবে ঘোষণা করেছেন)। সুতরাং আমি মনে করি সর্বোত্তম ভাবনাটি ক্লাসটিকে নতুন করে সংজ্ঞায়িত করা এবং তারিখটিকে স্ট্রিং হিসাবে নয়, ডেটটাইম হিসাবে ঘোষণা করা। কোড প্রায় একই থাকবে:

public class cTag:IComparable<cTag> {
    public int id { get; set; }
    public int regnumber { get; set; }
    public DateTime date { get; set; }
    public int CompareTo(cTag other) {
        return date.CompareTo(other.date);
    }
}

আপনার স্ট্রিংটি তারিখটি টাইম রূপে রূপান্তর করতে শ্রেণীর উদাহরণ তৈরি করার সময় আপনার কেবলমাত্র কাজটি করতে হবে তবে এটি DateTime.Parse(String)পদ্ধতি দ্বারা সহজেই করা যেতে পারে ।


38

এই ক্ষেত্রে আপনি লিনকিউ ব্যবহার করে বাছাই করতে পারেন:

week = week.OrderBy(w => DateTime.Parse(w.date)).ToList();


9

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

তারপরে আপনি একটি আইসিএমপিয়ার তৈরি করতে পারেন:

public class TagComparer : IComparer<cTag>
{
    public int Compare(cTag first, cTag second)
    {
        if (first != null && second != null)
        {
            // We can compare both properties.
            return first.date.CompareTo(second.date);
        }

        if (first == null && second == null)
        {
            // We can't compare any properties, so they are essentially equal.
            return 0;
        }

        if (first != null)
        {
            // Only the first instance is not null, so prefer that.
            return -1;
        }

        // Only the second instance is not null, so prefer that.
        return 1;
    }
}

var list = new List<cTag>();
// populate list.

list.Sort(new TagComparer());

আপনি এটি প্রতিনিধি হিসাবেও করতে পারেন:

list.Sort((first, second) =>
          {
              if (first != null && second != null)
                  return first.date.CompareTo(second.date);

              if (first == null && second == null)
                  return 0;

              if (first != null)
                  return -1;

              return 1;
          });

6

আপনি ঠিক বলেছেন - আপনার আইকোম্যাপারেবল প্রয়োগ করতে হবে। এটি করার জন্য, কেবল আপনার ক্লাসটি ঘোষণা করুন:

public MyClass : IComparable
{
  int IComparable.CompareTo(object obj)
  {
  }
}

CompareTo এ, আপনি কেবল আপনার কাস্টম তুলনা অ্যালগরিদম বাস্তবায়ন করেছেন (এটি করার জন্য আপনি ডেটটাইম অবজেক্টগুলি ব্যবহার করতে পারেন তবে প্রথমে "অবজেক্ট" টাইপ পরীক্ষা করার জন্য নিশ্চিত হন)। আরও তথ্যের জন্য, এখানে এবং এখানে দেখুন


7
IComparable<T>সম্ভবত এটি আরও ভাল পছন্দ হতে পারে, কারণ এটির জন্য পছন্দের জন্য পরীক্ষা করা হয় IComparable: এমএসডিএন.মাইক্রোসফটকম /en-us/library/b0zbh7b6.aspx
রিচার্ড সুইলে

5

আপনি লিনক ব্যবহার করতে পারেন:

var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag;
List<cTag> Sorted = q.ToList()

3

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


3

সমস্ত দ্রুত উত্তরগুলির জন্য ধন্যবাদ।

এটি আমার সমাধান:

Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); });

ধন্যবাদ


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