2009-07-21 236 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); 
}