繁体   English   中英

C#循环创建对象

[英]c# looping object creation

我是C#的新手,以前曾尝试忽略类,并在结构上更类似于PHP来构建我的小程序。 遇到障碍之后,我正在尝试重新开始并正确解决问题。 我正在准备一个长文件,并且在循环中,每次满足某些条件时,我都想创建一个新对象。 如何在不指定唯一名称的情况下创建新对象?

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

其次,一旦完成此操作,并且字符串&int设置了它们适当的对象属性,我如何才能通过一个属性对类进行唯一化,然后通过另一个属性对类进行排序?

很抱歉,如果这些是基本问题,我已经花费了大量时间第一次尝试通过Google和教科书自行解决。 如果只有C#允许使用不同类型的多维数组!

非常感谢!

PS。 我的意思是提取唯一对象的列表。

所有这些答案虽然有用,但似乎涉及创建IEnumerables的影子集。 班上没有办法做到这一点吗?

尝试由Earwicker提供的第一个解决方案,将每个对象从循环内添加到列表中,当我尝试将元素的属性写入控制台时,我得到了ClassName + Referral。 我在做什么错?-解决了。 仍然需要

还在工作。

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值命名的“插槽”中。 重复项将彼此静默覆盖。

首先,您将需要花费一些时间来熟悉该语言的基础知识以提高工作效率。 我建议您花一点时间阅读C#,然后再进行深入研究-否则,您将花费大量时间旋转轮子-或重新发明轮子:)

但是这里有一些信息可以帮助您入门。

通常,在C#中创建类来表示程序的元素-包括用于表示程序打算处理的信息(数据)的类。 您应该真正考虑使用一个,因为它将使数据操作更清晰,更易于管理。 我建议避免像某些人建议的那样避免使用无类型的多维数组结构,因为这些结构会变得非常难以使用。

您可以使用自动属性和简单的构造函数在C#中轻松创建Referall类:

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;
   }
}

您可以在创建它们时将它们添加到字典中-可以通过哪个属性唯一来键入字典。 字典允许您基于唯一键存储对象:

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

在处理项目时,可以将它们添加到字典中:

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

如果需要在完成后对字典中的项目进行排序,则可以在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 );
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);

否则,可以对List <Referral>使用Sort()方法。

您可以创建没有引用的对象,但是以后将无法访问该对象:

new Referral(string, string, int);

如果希望将它们放在数组/列表中,则这些不同的类型需要具有公共的基类。 这称为策略主义,这是面向对象编程中非常重要的概念。

使用c#时不能忽略类。 不要抗拒变化!

您真的不需要在这里创建一个类吗? 您真的不需要给它起个名字吗? C#确实允许松散键入,但是类型安全是一件好事。

我不完全了解您要做什么。 但是,也许LINQ是您想要的。 到处都有大量文档,但是作为快速的“筋急转弯”,请看一下MSDN上的101 Linq示例

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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM