වස්තුවක ඇති දේපලකින් ලැයිස්තුවක් වර්ග කරන්නේ කෙසේද <T>


1275

මම නමින් පන්තියට Orderවැනි ගුණ ඇති OrderId, OrderDate, Quantity, සහ Total. මට මෙම Orderපන්තියේ ලැයිස්තුවක් ඇත :

List<Order> objListOrder = new List<Order>();
GetOrderList(objListOrder); // fill list of orders

දැන් මට Orderවස්තුවෙහි එක් දේපලක් මත පදනම්ව ලැයිස්තුව වර්ග කිරීමට අවශ්‍යයි , උදාහරණයක් ලෙස ඇණවුම් දිනය හෝ ඇණවුම් හැඳුනුම්පත අනුව එය වර්ග කිරීමට මට අවශ්‍යය.

C # හි මෙය කරන්නේ කෙසේද?


9
රැඳී සිටින්න - ඔබට ඇණවුම් දිනය සහ ඇණවුම් හැඳුනුම්පත අනුව වර්ග කිරීමට අවශ්‍යද ? බොහෝ පිළිතුරු උපකල්පනය කරන්නේ ඔබ වර්ග කරන්නේ එක් හෝ වෙනත් ආකාරයකින් පමණක් බවයි.
GalacticCowboy

@ ගැලැක්ටික් කව්බෝයි, en ජෙනරික් ටයිප් ටී: ප්‍රශ්නය "මට ඇණවුම් වස්තුවෙහි එක් දේපලක් මත පදනම්ව ලැයිස්තුව වර්ග කිරීමට අවශ්‍යයි ", නමුත් වෙනත් තැනක එය සම්පූර්ණයෙන්ම පැහැදිලි නැති බව මම එකඟ වෙමි. කෙසේ වෙතත්, ඔබට දේපල එකක් හෝ කිහිපයක් අනුව වර්ග කිරීමට අවශ්‍යද යන්න විශාල වෙනසක් නොකරයි.
ලූක්

Uk ලූක් - නැවත කියවා ඇති අතර මම එකඟ වෙමි. 'මට එක් දේපලක් මත පදනම්ව ලැයිස්තුව වර්ග කිරීමට අවශ්‍යයි' ... සහ 'ඇණවුම් දිනය හෝ ඇණවුම් හැඳුනුම්පත'. සියලු පිළිතුරු අතර, අපි සියලු පදනම් ආවරණය කර ඇත :).
djdd87

Answers:


1836

මට සිතිය හැකි පහසුම ක්‍රමය වන්නේ ලින්ක් භාවිතා කිරීමයි:

List<Order> SortedList = objListOrder.OrderBy(o=>o.OrderDate).ToList();

23
මම මෙය අවරෝහණ පිළිවෙලට වර්ග කරන්නේ කෙසේද?
හුරුබුහුටි වලසා

232
OnBonusKun List <Order> SortedList = objListOrder. OrderByDescending (o => o.OrderDate) .ToList ();
javajavajavajavajava

78
මෙය මතකයේ ඇති සියලුම අයිතම සමඟ නව ලැයිස්තුවක් නිර්මාණය කරන බව සලකන්න, එය කාර්ය සාධනය අනුව ගැටළු සහගත විය හැකිය.
staafl

15
listWithObjects = listWithObjects.OrderByDescending(o => o.Status).ToList();එවැනි උත්සාහයක් සඳහා ස්ටාෆ්ල් ප්‍රමාණවත් වේද?
ඇන්ඩ rew ග්‍රින්ඩර්

28
astaafl අපි ඇණවුම් කරන්නේ වස්තු යොමු ලැයිස්තුවක් මිස මා දන්නා තරමින් වස්තූන් අනුපිටපත් නොකිරීමයි. මෙය යොමු ලැයිස්තුවෙන් භාවිතා කරන මතකය දෙගුණයක් වන අතර එය ඇත්ත වශයෙන්ම සියලු වස්තූන් අනුපිටපත් කිරීම තරම් නරක නැත, එබැවින් බොහෝ අවස්ථාවන්හිදී අප විශාල දත්ත කට්ටල සමඟ ගනුදෙනු කරන විට සහ ඒවා මතකයේ තබා ගැනීම දැනටමත් ගැටලුවක් වී ඇත. එය ප්‍රමාණවත් විය යුතුය.
ලාසරස්

812

ඔබට ලැයිස්තුව නිසි පරිදි වර්ග කිරීමට අවශ්‍ය නම් ඔබට එම Sortක්‍රමය භාවිතා කළ හැකිය Comparison<T>.

objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

තැනින් තැන වර්ග කරනවාට වඩා නව, වර්ග කළ අනුක්‍රමයක් නිර්මාණය කිරීමට ඔබ කැමති නම් OrderBy, අනෙක් පිළිතුරු වල සඳහන් පරිදි ඔබට LINQ ක්‍රමය භාවිතා කළ හැකිය .


30
ඔව්, මෙය “නිවැරදි” පිළිතුර වන අතර නව IEnumerable නිර්මාණය කර එය නව ලැයිස්තුවකට පරිවර්තනය කරනවාට වඩා කාර්යක්ෂම විය යුතුය.
ජොනතන් වුඩ්

50
ඇත්ත වශයෙන්ම, ඔබ ආකාරයක, swap බැස අවශ්ය නම් xහා yඊතල දකුණු-අත පැත්තේ =>.
ජෙප් ස්ටිග් නීල්සන්

15
ලැයිස්තුවේ ඇත්ත වශයෙන්ම වර්ග කරන සැබෑ පිළිතුර
මිචෙල් කුරී

3
ImPimBrouwers මෙය වඩා හොඳ විකල්ප කාල පරිච්ඡේදයයි. ඔබ භාවිතා කරන මතක ප්‍රමාණය ගැටලුවක් නොවුවද, මෙම විසඳුම අනවශ්‍ය මතක වෙන් කිරීම වළක්වයි, එය අතිශයින්ම මිල අධිකය. මෙම විකල්පය සරල කේත දිශාවකින් යුක්ත වන අතර විශාලත්වයේ අනුපිළිවෙල වේගවත් වේ.
Cdaragorn

12
On ජෝන්ස්නයිඩර් සඳහා Nullable<>( DateTime?නිදසුනක් ලෙස ගන්න) ඔබට භාවිතා කළ හැකි .Sort((x, y) => Nullable.Compare(x.OrderDate, y.OrderDate))අතර එය සියලු ශුන්‍ය නොවන අගයන්ට පෙර ශුන්‍ය ලෙස සලකනු ඇත. එය හරියටම සමාන ය .Sort((x, y) => Comparer<DateTime?>.Default.Compare(x.OrderDate, y.OrderDate).
ජෙප් ස්ටිග් නීල්සන්

222

.Net2.0 හි LINQ නොමැතිව මෙය කිරීමට:

List<Order> objListOrder = GetOrderList();
objListOrder.Sort(
    delegate(Order p1, Order p2)
    {
        return p1.OrderDate.CompareTo(p2.OrderDate);
    }
);

ඔබ .Net3.0 හි සිටී නම්, ලූක්ගේ පිළිතුර ඔබ පසුපසින් යන දෙයයි.

බහු ගුණාංග වර්ග කිරීම සඳහා, ඔබට එය නියෝජිතයෙකු තුළ කළ හැකිය. උදාහරණයක් වශයෙන්:

orderList.Sort(
    delegate(Order p1, Order p2)
    {
        int compareDate = p1.Date.CompareTo(p2.Date);
        if (compareDate == 0)
        {
            return p2.OrderID.CompareTo(p1.OrderID);
        }
        return compareDate;
    }
);

මෙය ඔබට අවරෝහණ ඇණවුම් සහිත නැගීමේ දිනයන් ලබා දෙනු ඇත.

කෙසේ වෙතත්, කේත නැවත භාවිතා කිරීමකින් තොරව ස්ථාන රාශියක් අදහස් වන බැවින් නියෝජිතයින් ඇලී සිටීමට මම නිර්දේශ නොකරමි. ඔබ එය ක්‍රියාත්මක කළ යුතු IComparerඅතර එය ඔබේ Sortක්‍රමයට යොමු කළ යුතුය. මෙහි බලන්න .

public class MyOrderingClass : IComparer<Order>
{
    public int Compare(Order x, Order y)
    {
        int compareDate = x.Date.CompareTo(y.Date);
        if (compareDate == 0)
        {
            return x.OrderID.CompareTo(y.OrderID);
        }
        return compareDate;
    }
}

ඉන්පසු මෙම IComparer පන්තිය භාවිතා කිරීම සඳහා, එය ක්ෂණිකව සකසා ඔබේ වර්ග කිරීමේ ක්‍රමයට යොමු කරන්න:

IComparer<Order> comparer = new MyOrderingClass();
orderList.Sort(comparer);

1
විශිෂ් answer පිළිතුර, සහ නිවැරදි ලැයිස්තුව විය යුතු අතර එය මුල් ලැයිස්තුව නැවත ආරම්භ කිරීම ආරක්ෂා කරයි (LINQ අනුවාදය සැමවිටම කරනු ඇත) වඩා හොඳ සංවර්‍ධනයක් සපයයි.
ජෙබ්

@ වොන්ටන්, නැත. අදහස නම් IComparer, අපට බහු ක්‍රියාකාරී හැසිරීම් ලබා දෙමින් විවිධ ක්‍රියාත්මක කිරීම් කිරීමට හැකිවීමයි .
රේඩාර්බෝබ්

මා වෙනුවෙන් වැඩ කළා. වර්ග කිරීමේ විකල්පයන් සමඟ මම මෙහි අනුවාදයක් පළ කළෙමි.
ජැක් ග්‍රිෆින්

111

ලැයිස්තුවක් ඇණවුම් කිරීමට සරලම ක්‍රමය භාවිතා කිරීමයි OrderBy

 List<Order> objListOrder = 
    source.OrderBy(order => order.OrderDate).ToList();

ඔබට SQL විමසුම අනුගමනය කිරීම වැනි තීරු කිහිපයකින් ඇණවුම් කිරීමට අවශ්‍ය නම්.

ORDER BY OrderDate, OrderId

මෙය සාක්ෂාත් කර ගැනීම සඳහා ඔබට ThenByපහත සඳහන් පරිදි භාවිතා කළ හැකිය .

  List<Order> objListOrder = 
    source.OrderBy(order => order.OrderDate).ThenBy(order => order.OrderId).ToList();

32

ඔබ කී පරිදි ලින්ක් නොමැතිව එය කිරීම:

public class Order : IComparable
{
    public DateTime OrderDate { get; set; }
    public int OrderId { get; set; }

    public int CompareTo(object obj)
    {
        Order orderToCompare = obj as Order;
        if (orderToCompare.OrderDate < OrderDate || orderToCompare.OrderId < OrderId)
        {
            return 1;
        }
        if (orderToCompare.OrderDate > OrderDate || orderToCompare.OrderId > OrderId)
        {
            return -1;
        }

        // The orders are equivalent.
        return 0;
    }
}

ඔබගේ ඇණවුම් ලැයිස්තුවේ .sort () අමතන්න


3
එක් විය යුතු පළමු ටෙස්ට් nullමත asකාස්ට්. as(හෙක්, හෙක්) (Order)objඅසමත් වූ විට ව්‍යතිරේකයක් විසි කරන පරිදි, සමස්ත ලක්ෂ්‍යය එයයි . if(orderToCompare == null) return 1;.
රේඩාර්බෝබ්

+1 අතුරුමුහුණත භාවිතා කිරීම සඳහා වන අතර එමඟින් කේතය නඩත්තු කිරීමට පහසු වන අතර වස්තුවේ හැකියාවන් පැහැදිලිව නිරාවරණය වේ.
AeonOfTime

- පනත් කෙටුම්පත සහ ටෙඩ් මෙතෙක් පෙන්නුම් නම් මම ඉහත මගේ වැරැද්ද නිවැරදි කළ හැකි නිසා මට ආපහු ඔක්තෝබර් 16, 2014 ගැනීමට ඔවුන් අසමි asප්රතිලාභ nullකාස්ට් ඔෆ් ද අපොහොසත් වන්නේ නම්,. නමුත් අවම වශයෙන් ශූන්‍ය පරීක්ෂණය නිවැරදි ය.
radarbob

@radarbob ඔව් .. අපොයි. :) ඒත්! මෙම ශ්‍රිතය ලැයිස්තුවක් හරහා වර්ග කිරීමකින් ස්වයංක්‍රීයව භාවිතා කිරීමට අදහස් කර ඇති අතර List<Order>එමඟින් වර්ගය as2014 ට ගැලපෙන බවට සහතික විය යුතුය. එබැවින් ඔබ බොහෝ විට දෝෂයක් ලියා නොතිබුණි, අනවශ්‍ය ආරක්ෂක ප්‍රකාශයක් මග හැරීමට තරම් :)
ජිමී හොෆා

සිත්ගන්නා කරුණ සහතික කළ යුතුය . එය හොඳින් වටකර තිබේ නම් එය සමත් වීම හැර එය හැඳින්විය නොහැක List<Order>. නමුත් ඔබ සහ මම දෙදෙනාම ස්වයං-සංක්ෂිප්ත ක්‍රමලේඛකයෙකු මුණගැසී ඇති අතර, නොකියූ උපකල්පනය නම් "මම මෙම කේතය ලියන්නේ එය වැරදි ලෙස භාවිතා නොකරනු ඇත"
රේඩාර්බෝබ්

26

සම්භාව්‍ය වස්තුව දිශානත විසඳුමක්

පළමුවෙන්ම මම ලින්ක් හි විශ්මය ජනක බව වටහා ගත යුතුය .... දැන් අපට එය මඟ හැරී ඇත

ජිමී හොෆා පිළිතුරේ වෙනසක්. ජනක විද්‍යාව සමඟ CompareToපරාමිතිය ආරක්ෂිත වර්ගයක් බවට පත්වේ.

public class Order : IComparable<Order> {

    public int CompareTo( Order that ) {
        if ( that == null ) return 1;
        if ( this.OrderDate > that.OrderDate) return 1;
        if ( this.OrderDate < that.OrderDate) return -1;
        return 0;
    }
}

// in the client code
// assume myOrders is a populated List<Order>
myOrders.Sort(); 

මෙම පෙරනිමි වර්ග කිරීම ඇත්ත වශයෙන්ම නැවත භාවිතා කළ හැකිය. එනම් සෑම සේවාදායකයෙකුටම වර්ග කිරීමේ තර්කනය අතිරික්තව නැවත ලිවිය යුතු නැත. "1" සහ "-1" මාරු කිරීම (හෝ තාර්කික ක්‍රියාකරුවන්, ඔබේ තේරීම) වර්ග කිරීමේ අනුපිළිවෙල ආපසු හරවයි.


ලැයිස්තුවක වස්තු වර්ග කිරීම සඳහා සරල ප්‍රවේශය. නමුත් මට තේරෙන්නේ නැහැ ඔබ 1 ආපසු එන්නේ නම් (එය == ශුන්‍යයි)?
ලොක් හුයින්

4
එහි තේරුම thisවස්තුව ශුන්‍යයට වඩා විශාල බවයි. වර්ග කිරීම සඳහා, ශුන්‍ය වස්තු යොමු කිරීමක් “වස්තුවට වඩා අඩුය” this. ශුන්‍යයන් වර්ග කරන්නේ කෙසේද යන්න නිර්වචනය කිරීමට මා තීරණය කළ ක්‍රමය එයයි.
රේඩාර්බෝබ්

18

ග්‍රිඩ් දර්ශනයක් සමඟ භාවිතා කිරීම සඳහා සම්පුර්ණයෙන්ම සාමාන්‍ය වර්ග කිරීම

public List<T> Sort_List<T>(string sortDirection, string sortExpression, List<T> data)
    {

        List<T> data_sorted = new List<T>();

        if (sortDirection == "Ascending")
        {
            data_sorted = (from n in data
                              orderby GetDynamicSortProperty(n, sortExpression) ascending
                              select n).ToList();
        }
        else if (sortDirection == "Descending")
        {
            data_sorted = (from n in data
                              orderby GetDynamicSortProperty(n, sortExpression) descending
                              select n).ToList();

        }

        return data_sorted;

    }

    public object GetDynamicSortProperty(object item, string propName)
    {
        //Use reflection to get order type
        return item.GetType().GetProperty(propName).GetValue(item, null);
    }

4
නැත්නම්, ඔබ දන්නවා data.OrderBy(). රෝදය නැවත ප්‍රතිනිර්මාණය කිරීම පහසුය.
gunr2171

4
අදහස නම් මෙය ඕනෑම වර්ගයක වස්තුවක් සමඟ ක්‍රියා කරනු ඇත. OrderBy () ලෙස ක්‍රියා කරන්නේ දැඩි ලෙස ටයිප් කළ වස්තු සමඟ පමණි.
රොජර්

1
බොහෝ දේ. මගේ මතය අනුව, වඩාත්ම සරල හා භාවිතා කළ හැකි විසඳුම ජාල දත්ත වර්ග කිරීම!
කොස්ටාස් ච.

6

ලැයිස්තුවේ අමතර පිටපතක් නිර්මාණය නොකරන සාමාන්‍ය LINQ දිගු කිරීමේ ක්‍රමයක් මෙන්න:

public static void Sort<T,U>(this List<T> list, Func<T, U> expression)
    where U : IComparable<U>
{
    list.Sort((x, y) => expression.Invoke(x).CompareTo(expression.Invoke(y)));
}

එය භාවිතා කිරීමට:

myList.Sort(x=> x.myProperty);

ICompare<U>සංසන්දනය අභිරුචිකරණය කිරීමට හැකි වන පරිදි මම මෑතකදී මෙම අතිරේක එකක් පිළිගනිමි. මට ස්වාභාවික නූල් වර්ග කිරීමක් කිරීමට අවශ්‍ය වූ විට මෙය ප්‍රයෝජනවත් විය:

public static void Sort<T, U>(this List<T> list, Func<T, U> expression, IComparer<U> comparer)
    where U : IComparable<U>
{    
    list.Sort((x, y) => comparer.Compare(expression.Invoke(x), expression.Invoke(y)));
}

මම මෙය ක්‍රියාත්මක කර ඇත්තෙමි. මම "isAscending = true" පරාමිතියක් එක් කළෙමි. අවරෝහණ පිළිවෙලට වර්ග කිරීම සඳහා, ඉන්වොක් () ක්‍රම දෙක තුළ x සහ y වටා මාරු වන්න. ස්තූතියි.
රොබ් එල්

ඔබ ප්‍රකාශනය සම්පාදනය කිරීමට යන්නේ නම්, ආරම්භ කිරීම සඳහා නියෝජිතයෙකු පිළිගත හැකිය. මීට අමතරව, තේරීම්කරු අතුරු ආබාධ ඇති කරයි නම්, ගණනය කිරීමට මිල අධික නම් හෝ නිර්ණායක නොවේ නම් මෙම ප්‍රවේශයට විශාල ගැටළු ඇත. තෝරාගත් ප්‍රකාශනයක් මත පදනම්ව නිසි ලෙස වර්ග කිරීම සඳහා ලැයිස්තුවේ ඇති එක් අයිතමයකට එක් වරකට වඩා තේරීම් කාරකයට ආයාචනා කිරීම අවශ්‍ය නොවේ.
සර්වි

Er සේවාව - ඒවා සියල්ලම වලංගු කරුණු වේ, නමුත් මම අවංක වන්නෙමි, ඔබගේ සමහර යෝජනා ක්‍රියාත්මක කරන්නේ කෙසේදැයි මට විශ්වාස නැත (විශේෂයෙන් තේරීම් කාරකය අතුරු ආබාධ ඇතිවීම වළක්වයි ...?). මම ඔවුන්ව නියෝජිතයන් ලෙස වෙනස් කර ඇත්තෙමි. එම වෙනස්කම් වලින් සමහරක් කරන්නේ කෙසේදැයි ඔබ දන්නේ නම්, ඔබ මගේ කේතය සංස්කරණය කිරීම ගැන මම සතුටු වෙමි.
පීටර්

3
Et පීටර් ඔබට නියෝජිතයින්ට අතුරු ආබාධ ඇතිවීම වැළැක්විය නොහැක . ඔබට කළ හැකි දෙය නම්, ඒවා කිසි විටෙකත් වස්තුවකට එක් වරකට වඩා නොකියන බව සහතික කිරීමයි, මෙයින් අදහස් කරන්නේ එක් එක් වස්තුව සඳහා අගයන් ගණනය කිරීම, වස්තුව / ප්‍රක්ෂේපිත අගය යුගල ගබඩා කිරීම සහ එය වර්ග කිරීම . OrderByඒ සියල්ල අභ්‍යන්තරව කරයි.
සර්වි

voidමෙම ආත්මය තුළ දිගු කිරීමේ ක්‍රමයක් ලිවීමට තවත් හොඳ ක්‍රමයක් : ක්‍රමයකින් static class Extensions { public static void SortBy<TSource, TKey>(this List<TSource> self, Func<TSource, TKey> keySelector) { self.SortBy(keySelector, Comparer<TKey>.Default); } public static void SortBy<TSource, TKey>(this List<TSource> self, Func<TSource, TKey> keySelector, IComparer<TKey> comparer) { self.Sort((x, y) => comparer.Compare(keySelector(x), keySelector(y))); } }අතිරේක කළ හැකිය SortByDescending. @ සර්විගේ අදහස් මගේ
ජෙප් ස්ටිග් නීල්සන්


3
//Get data from database, then sort list by staff name:

List<StaffMember> staffList = staffHandler.GetStaffMembers();

var sortedList = from staffmember in staffList
                 orderby staffmember.Name ascending
                 select staffmember;

3

රොජර්ගේ අනුවාදය වැඩි දියුණු කිරීම.

GetDynamicSortProperty හි ඇති ගැටළුව නම් දේපල නම් පමණක් ලබා ගැනීමයි. නමුත් ග්‍රිඩ්වීව් හි අපි NavigationProperties භාවිතා කරන්නේ නම් කුමක් සිදුවේද? එය ශුන්‍ය බව සොයා ගන්නා බැවින් එය ව්‍යතිරේකයක් යවනු ඇත.

උදාහරණයක්:

"Employee.Company.Name;" බිඳ වැටෙනු ඇත ... පරාමිතියක් ලෙස එහි නම ලබා ගැනීමට "නම" පමණක් ඉඩ දෙන බැවින්.

සංචාලන ගුණාංග අනුව වර්ග කිරීමට අපට ඉඩ දෙන වැඩි දියුණු කළ අනුවාදයක් මෙන්න.

public object GetDynamicSortProperty(object item, string propName)
    {
        try
        {                 
            string[] prop = propName.Split('.'); 

            //Use reflection to get order type                   
            int i = 0;                    
            while (i < prop.Count())
            {
                item = item.GetType().GetProperty(prop[i]).GetValue(item, null);
                i++;
            }                     

            return item;
        }
        catch (Exception ex)
        {
            throw ex;
        }


    } 

3

දේපල තේරීම පිළිබඳව ඔබට වඩාත් සාමාන්‍ය දෙයක් කළ හැකි නමුත් ඔබ තෝරා ගන්නා වර්ගය ගැන නිශ්චිත වන්න.

ඔබේ ශ්‍රිතය සාමාන්‍ය එකක් ලෙස ලියන්න:

public List<Order> GetOrderList<T>(IEnumerable<Order> orders, Func<Order, T> propertySelector)
        {
            return (from order in orders
                    orderby propertySelector(order)
                    select order).ToList();
        } 

ඉන්පසු එය මේ ආකාරයට භාවිතා කරන්න:

var ordersOrderedByDate = GetOrderList(orders, x => x.OrderDate);

ඔබට ඊටත් වඩා සාමාන්‍ය විය හැකි අතර ඔබට ඇණවුම් කිරීමට අවශ්‍ය දේ සඳහා විවෘත වර්ගයක් අර්ථ දැක්විය හැකිය:

public List<T> OrderBy<T,P>(IEnumerable<T> collection, Func<T,P> propertySelector)
        {
            return (from item in collection
                    orderby propertySelector(item)
                    select item).ToList();
        } 

එය එකම ආකාරයකින් භාවිතා කරන්න:

var ordersOrderedByDate = OrderBy(orders, x => x.OrderDate);

එය ලින්ක් ශෛලියක් වන 'ඕඩර්බයි' කිරීමේ මෝඩ අනවශ්‍ය සංකීර්ණ ක්‍රමයකි, නමුත් එය සාමාන්‍ය ආකාරයකින් ක්‍රියාත්මක කළ හැකි ආකාරය පිළිබඳ ඉඟියක් ඔබට ලබා දෙනු ඇත.


3

කරුණාකර නියැදි කේතයක් සමඟ ukLukeH විසින් පිළිතුර සම්පූර්ණ කිරීමට මට ඉඩ දෙන්න, මම එය පරීක්ෂා කර ඇති බැවින් එය සමහරුන්ට ප්‍රයෝජනවත් වනු ඇතැයි මම විශ්වාස කරමි:

public class Order
{
    public string OrderId { get; set; }
    public DateTime OrderDate { get; set; }
    public int Quantity { get; set; }
    public int Total { get; set; }

    public Order(string orderId, DateTime orderDate, int quantity, int total)
    {
        OrderId = orderId;
        OrderDate = orderDate;
        Quantity = quantity;
        Total = total;
    }
}

public void SampleDataAndTest()
{
    List<Order> objListOrder = new List<Order>();

    objListOrder.Add(new Order("tu me paulo ", Convert.ToDateTime("01/06/2016"), 1, 44));
    objListOrder.Add(new Order("ante laudabas", Convert.ToDateTime("02/05/2016"), 2, 55));
    objListOrder.Add(new Order("ad ordinem ", Convert.ToDateTime("03/04/2016"), 5, 66));
    objListOrder.Add(new Order("collocationem ", Convert.ToDateTime("04/03/2016"), 9, 77));
    objListOrder.Add(new Order("que rerum ac ", Convert.ToDateTime("05/02/2016"), 10, 65));
    objListOrder.Add(new Order("locorum ; cuius", Convert.ToDateTime("06/01/2016"), 1, 343));


    Console.WriteLine("Sort the list by date ascending:");
    objListOrder.Sort((x, y) => x.OrderDate.CompareTo(y.OrderDate));

    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    Console.WriteLine("Sort the list by date descending:");
    objListOrder.Sort((x, y) => y.OrderDate.CompareTo(x.OrderDate));
    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    Console.WriteLine("Sort the list by OrderId ascending:");
    objListOrder.Sort((x, y) => x.OrderId.CompareTo(y.OrderId));
    foreach (Order o in objListOrder)
        Console.WriteLine("OrderId = " + o.OrderId + " OrderDate = " + o.OrderDate.ToString() + " Quantity = " + o.Quantity + " Total = " + o.Total);

    //etc ...
}



1

GenericTypeTea හි සංසන්දකයා මත පදනම්ව
: කොඩි වර්ග කිරීමෙන් අපට වඩාත් නම්‍යශීලී බවක් ලබා ගත හැකිය:

public class MyOrderingClass : IComparer<Order> {  
    public int Compare(Order x, Order y) {  
        int compareDate = x.Date.CompareTo(y.Date);  
        if (compareDate == 0) {  
            int compareOrderId = x.OrderID.CompareTo(y.OrderID);  

            if (OrderIdDescending) {  
                compareOrderId = -compareOrderId;  
            }  
            return compareOrderId;  
        }  

        if (DateDescending) {  
            compareDate = -compareDate;  
        }  
        return compareDate;  
    }  

    public bool DateDescending { get; set; }  
    public bool OrderIdDescending { get; set; }  
}  

මෙම තත්වය තුළ, එහි වර්ග කිරීමේ ගුණාංග සැකසීම සඳහා ඔබ එය පැහැදිලිවම MyOrderingClass ලෙස (ඒ වෙනුවට IComparer )
ස්ථාපනය කළ යුතුය:

MyOrderingClass comparer = new MyOrderingClass();  
comparer.DateDescending = ...;  
comparer.OrderIdDescending = ...;  
orderList.Sort(comparer);  

1

ඉහත පිළිතුරු කිසිවක් මට ප්‍රමාණවත් නොවූ නිසා මම මෙය කළෙමි:

var someUserInputStringValue = "propertyNameOfObject i.e. 'Quantity' or 'Date'";
var SortedData = DataToBeSorted
                   .OrderBy(m => m.GetType()
                                  .GetProperties()
                                  .First(n => 
                                      n.Name == someUserInputStringValue)
                   .GetValue(m, null))
                 .ToList();

දැවැන්ත දත්ත කට්ටල ගැන සැලකිලිමත් වන්න. එය පහසු කේතයක් වන නමුත් එකතුව අති විශාල නම් සහ එකතුවෙහි වස්තු වර්ගය විශාල ප්‍රමාණයක් තිබේ නම් ඔබට කරදරයක් විය හැකිය. ධාවන කාලය NxM කොහෙද:

එකතු කිරීමේ මූලද්‍රව්‍ය N = #

M = # වස්තුව තුළ ඇති දේපල


1

අහෝසි කළ හැකි වර්ග සමඟ වැඩ කරන ඕනෑම කෙනෙකුට Valueභාවිතා කිරීමට අවශ්‍ය වේ CompareTo.

objListOrder.Sort((x, y) => x.YourNullableType.Value.CompareTo(y.YourNullableType.Value));


1

ඔබට පහත කේතය ඇතැයි සිතමු, මෙම කේතයේ, අපට පදනම් කර ගෙන වර්ග කිරීමට අවශ්‍ය ගුණාංග කිහිපයක් සහිත මගී පන්තියක් අප සතුව ඇත.

public class Passenger
{
    public string Name { get; }
    public string LastName { get; }
    public string PassportNo { get; }
    public string Nationality { get; }

    public Passenger(string name, string lastName, string passportNo, string nationality)
    {
        this.Name = name;
        this.LastName = lastName;
        this.PassportNo = passportNo;
        this.Nationality = nationality;
    }

    public static int CompareByName(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.Name, passenger2.Name);
    }

    public static int CompareByLastName(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.LastName, passenger2.LastName);
    }

    public static int CompareNationality(Passenger passenger1, Passenger passenger2)
    {
        return String.Compare(passenger1.Nationality, passenger2.Nationality);
    }
}

public class TestPassengerSort
{
    Passenger p1 = new Passenger("Johon", "Floid", "A123456789", "USA");
    Passenger p2 = new Passenger("Jo", "Sina", "A987463215", "UAE");
    Passenger p3 = new Passenger("Ped", "Zoola", "A987855215", "Italy");

    public void SortThem()
    {
        Passenger[] passengers = new Passenger[] { p1, p2, p3 };
        List<Passenger> passengerList = new List<Passenger> { p1, p2, p3 };

        Array.Sort(passengers, Passenger.CompareByName);
        Array.Sort(passengers, Passenger.CompareByLastName);
        Array.Sort(passengers, Passenger.CompareNationality);

        passengerList.Sort(Passenger.CompareByName);
        passengerList.Sort(Passenger.CompareByLastName);
        passengerList.Sort(Passenger.CompareNationality);

    }
}

එබැවින් සංයුති නියෝජිතයා භාවිතා කිරීමෙන් ඔබට ඔබේ වර්ග කිරීමේ ව්‍යුහය ක්‍රියාත්මක කළ හැකිය.


0

කාර්ය සාධන දෘෂ්ටි කෝණයෙන් බැලූ විට හොඳම දෙය වන්නේ වර්ග කළ ලැයිස්තුවක් භාවිතා කිරීමයි. වෙනත් ප්‍රවේශයන් සඳහා දත්ත සඳහා අවම වශයෙන් එක් අමතර ක්‍රියාවක් අවශ්‍ය වන අතර බොහෝ ඒවා දත්ත පිටපතක් නිර්මාණය කරයි, එවිට කාර්ය සාධනය පමණක් නොව මතක භාවිතය ද බලපානු ඇත. මූලද්‍රව්‍ය සිය ගණනක් සමඟ ගැටළුවක් නොවිය හැකි නමුත් දහස් ගණනක් සමඟ විය හැකිය, විශේෂයෙන් බොහෝ සමගාමී ඉල්ලීම් එකවර වර්ග කිරීම කළ හැකි සේවාවන්හි. System.Collections.Generic නාම අවකාශය දෙස බලා ලැයිස්තුව වෙනුවට වර්ග කිරීම සහිත පන්තියක් තෝරන්න.

හැකි සෑම විටම පරාවර්තනය භාවිතා කරමින් සාමාන්‍ය ක්‍රියාත්මක කිරීමෙන් වළකින්න, මෙය කාර්ය සාධන ගැටළු ද ඇති කළ හැකිය.


මෙය වඩාත් ක්‍රියාකාරී වන්නේ කෙසේද? වර්ග කළ ලැයිස්තුවකට දත්ත ඇතුළත් කිරීම O (n), එබැවින් n අයිතම එකතු කිරීම O (n ^ 2) වේ. බොහෝ සමගාමී අයිතම එකතු කිරීමට උත්සාහ කරන්නේ කුමක්ද? අයිතම එකතු කරන විට දහනය කිරීමට ඔබට අමතර CPU චක්‍ර ඇති අවස්ථා තිබේ, නමුත් මෙය හොඳ පොදු විසඳුමක් නොවේ.
ජෝන් ලා රූයි
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.