簡體   English   中英

C#在某種程度上是這個委托

[英]c# What is this delegate within a sort

我不理解這種語法中使用委托的邏輯。 我正在尋找對字符串進行排序並遇到這種情況的方法...

 Array.Sort (thing, delegate (Things c1, Things c2)
            {
                return c1.Item.CompareTo(c2.Item); 
            }); 

對於某些屬於.NET Framework的類,例如String類和代表數字的類(int,float,decimal,...),委托是可選的,因為接口IComparable (請參閱@Idle_Mind答案)實現。

如果要實現特殊行為,或者要在未實現IComparable的不可編輯類上使用比較機制,則可以定義此委托。

考慮到您必須正常地對字符串進行排序:

string s = "eabdfc"; //String to sort
char[] sa = s.ToCharArray(); //Convert to array
Array.Sort(sa); //Sort without any delegate
Console.WriteLine(new string(sa)); // The new string sorted

考慮到必須在另一個方向上對字符串進行排序,可以將Array.Sort行替換為:

Array.Sort(sa, (x, y) => x.CompareTo(y) * -1);

為什么呢 因為CompareTo必須返回:

  • 如果元素x <y則為-1
  • 如果元素x = y,則為0
  • 如果元素x> y為1

因此,如果要對任何類使用Array.Sort,則必須:實現IComparable接口(如果它是用戶定義的類),或者定義委托。

總結:委托提供了更大的靈活性,因為我們可以在同一地方為同一類或同一對象編寫不同的行為,而IComparable為一個類提供默認行為。

我希望我的英語是可以理解的,請隨時糾正我。

委托(稱為匿名函數)使您可以聲明比較機制,而無需完全獨立的函數,如下所示:

    private void button1_Click(object sender, EventArgs e)
    {
        Things t1 = new Things();
        t1.Item = "z";
        Things t2 = new Things();
        t2.Item = "a";

        Things[] things = new Things[]{ t1, t2};
        Array.Sort(things, CompareThings);

        foreach(Things t in things)
        {
            Console.WriteLine(t.Item);
        }
    }

    private int CompareThings(Things c1, Things c2)
    {
        return c1.Item.CompareTo(c2.Item);
    }

這是MSDN上的示例,其中顯示了一個排序的兩個版本,一個具有匿名函數,一個具有聲明的函數(如上所述)。

附帶說明一下, c1.Itemc2.Itemc1.Item進行顯式比較,因為.Net不知道如何將一個“ Things”實例與另一個“ Things”實例進行比較。 但是,如果實現IComparable接口,則代碼將變得更加簡潔 ,因為您不需要匿名或單獨的函數:

public class Things : IComparable<Things>
{
    public string Item = "";

    int IComparable<Things>.CompareTo(Things other)
    {
        return this.Item.CompareTo(other.Item);
    }

}

其次是:

    private void button1_Click(object sender, EventArgs e)
    {
        Things t1 = new Things();
        t1.Item = "z";
        Things t2 = new Things();
        t2.Item = "a";

        Things[] things = new Things[]{ t1, t2};
        Array.Sort(things); // <-- the intenal implementation of CompareTo() we added to class Things will be used!

        foreach(Things t in things)
        {
            Console.WriteLine(t.Item);
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM