2009-07-21 240 views
1

我對c#很新,以前試圖忽略類並構建我的小程序結構更類似於PHP。在到達路障後,我試着重新開始並正確處理問題OO。我正在寫一個長文件,並且在一個循環中,每當滿足某些條件時,我想創建一個新對象。我怎樣才能創建一個新的對象,而不必指定一個唯一的名稱?c#循環對象創建

Referral ObjectName = new Referral(string, string, int); 

其次,一旦做到這一點,和琴絃& INT設置其相應的對象的屬性,我怎麼能唯一-IFY一個屬性的類,然後由另一排序類?

對不起,如果這些都是基本問題,我花了大量的時間,首先嚐試用谷歌和教科書自己弄清楚。如果只有C#會允許具有不同類型的多維數組!

非常感謝!

PS。我的意思是提取一個獨特的對象列表。

所有這些答案雖然有幫助,但似乎涉及創建IEnumerables的影子集。有沒有辦法與類本身做到這一點?

嘗試第一個解決方案,由Earwicker提供,當我嘗試將元素的屬性寫入控制檯時,我將每個對象添加到循環中的List,我得到ClassName + Referral。我怎麼會做錯了? - 解決了。仍然需要。物業

仍在工作。 。 。

+0

嗯,你是什麼意思的'獨特ify'?你想提取一個獨特的推薦對象列表? – 2009-07-21 18:12:53

+0

聽起來像你應該有一個快速閱讀這個http://msdn.microsoft.com/en-gb/library/ybcx56wz.aspx – 2009-07-21 21:44:48

回答

6

C#確實允許無類型數組。所有對象最終都從object派生,因此您使用的數組或容器的編號爲object。但這很少有必要。你有多少個類型

在循環塊中,您可以完全按照您在該行代碼中執行的操作來創建對象(固定語法除外),並且每次在循環中都會有一個新對象。爲了讓所有可用的外循環的對象,你將它添加到一個容器:

List<Referral> referrals = new List<Referral>(); 

// in the loop: 
Referral r = new Referral(str1, str2, num1); 
referrals.Add(r); 

假設Referral有一個數值屬性稱爲Cost

referrals.Sort((l, r) => l.Cost - r.Cost); 

按成本排序。

爲確保按鍵的唯一性,您可能會發現選擇更合適的容器更容易。

Dictionary<string, Referral> referrals = new List<Referral>(); 

// in the loop: 
Referral r = new Referral(str1, str2, num1); 
referrals[str1] = r; 

這存儲在一個「時隙」的str1值命名的引用。重複將無聲地覆蓋對方。

+0

使用lambda的排序意味着你將有LINQ支持,在這種情況下OrderBy語法是(imo)更易於使用。 – Thorarin 2009-07-21 18:26:05

+0

確實如此,但對於大數據集,`List`上的`Sort`可能會更快一些 - 取決於哪一個對您更重要。 – 2009-07-21 18:39:45

0

使用c#時不能忽略類。不要拒絕改變!

你真的不需要在這裏創建一個類嗎?你真的不需要說出它的名字嗎? C#確實允許寬鬆輸入,但類型安全性是一件好事。

2
List<Referral> referrals = new List<Referral>(); 

for (...) 
{ 
    referrals.Add(new Referral(string1, string2, number1)); 
} 

然後,如果你正在使用LINQ(我強烈建議),你可以這樣做:

IEnumerable<Referral> sorted = referrals.OrderBy(x => x.string1).ThenBy(x => x.string2); 

否則,您可以使用清單<推薦>的sort()方法。

1

您可以創建一個對象沒有一個參考,但你不會有以後任何訪問:

new Referral(string, string, int); 

如果你希望把它們放在一個數組/列表,這些不同類型的需要有一個共同的基類。這就是所謂的polimorfism,這是OO編程中一個非常重要的概念。

2

首先,您需要花一些時間熟悉該語言的基礎知識才能提高工作效率。我建議你花一點時間在C#上閱讀太深的內容 - 否則你會花很多時間旋轉你的輪子 - 或重塑他們:)

但是,這裏有一些信息讓你開始。

通常,在C#中,您可以創建類來表示程序的元素 - 包括用於表示程序想要操作的信息(數據)的類。你應該考慮使用它,因爲它會使數據操作更清晰,更易於管理。我建議避免像某些人所暗示的無類型的多維數組結構,因爲這些結構很快就變得非常難以使用。

可以使用自動屬性和一個簡單的構造容易地創建在C#中介紹朋友類:

public class Referall 
{ 
    // these should be named in line with what they represent... 
    public string FirstString { get; set; } 
    public string AnotherString { get; set; } 
    public int SomeValue  { get; set; } 

    public Referall(string first, string another, int value) 
    { 
     FirstString = first; 
     AnotherString = another; 
     SomeValue = value; 
    } 
} 

您可以添加這些以字典爲您創建它們 - 字典可以鍵入由曾經屬性獨特。詞典讓你基於一個獨特的密鑰存儲對象:如果你需要你的時候到項目的字典排序

Referall ref = new Referall(v1, v2, v3); 
// add to the dictionary, keying on FirstString... 
dict.Add(ref.FirstString, ref); 

Dictionary<string,Referall> dict = new Dictionary<string,Referall>(); 

如您處理的項目,你可以將它們添加到字典大功告成了,你可以在C#3.0中使用LINQ:

IEnumerable<Referall> sortedResults = 
     dict.Values.OrderBy(x => x.AnotherString); 

您可以通過使用ThenBy(多維排序),以及:

IEnumerable<Referall> sortedResults = 
     dict.Values.OrderBy(x => x.AnotherString) 
        .ThenBy(x => x.SomeValue); 
0

我不完全明白你想要做什麼。但也許LINQ是你在找什麼。有大量的文檔,但作爲一個快速的'傳情'看看101 Linq samples on MSDN

0

C#包括一個奇妙的功能稱爲「迭代塊」。你想要做的就是使用yield關鍵字來創建一個你的Referal對象的Enumerable,類似這樣的事情(不是我在製作文件格式和屬性名稱,因爲你沒有共享它):

public class Referral 
{ 
    public Guid id { get; private set; } // "uniquify" 
    public int ReferringId { get; set; } 
    public string ReferrerText { get; set; } 
    public string ReferrerDescription { get; set; } 

    private Referral() 
    { 
     id = new Guid(); 
    } 

    private Referral(string Text, string Description, int ReferringId) : this() 
    { 
     this.ReferrerText = Text; 
     this.ReferrerDescription = Description; 
     this.ReferringId = ReferringId; 
    } 

    public static IEnumerable<Referral> GetReferrals(string fileName) 
    { 
     using (var rdr = new StreamReader(fileName)) 
     { 
      var next = new Referrer(); 

      int state = 0; 
      string line; 
      while ((line = rdr.ReadLine()) != null) 
      { 
       switch (state) 
       { 
        case 0: 
         next.ReferrerText = line; 
         state = 1; 
         break; 

        case 1: 
         next.ReferrerDescription = line; 
         state = 2; 
         break; 

        case 2: 
         next.ReferringId = int.Parse(line); 
         yield return next; 
         next = new Referral(); 
         state = 0; 
         break; 
       } 
      }     
     } 
    } 
} 

現在你想排序的推介和推定枚舉他們出於某種目的。你可以這樣做,很容易:

foreach (var referral in Referral.GetReferrals(@"C:\referralfile.txt").OrderBy(r => r.Text)) 
{ 
    OutputReferral(referral); 
}