迭代一堆对象

时间:2015-06-19 18:23:04

标签: c# iteration

我有八个对象是超类的子类。它们都共享相同的字段和属性。我想要做的是以某种方式迭代这组对象并找到第一个将其Status字段设置为false的对象,然后更新与该对象关联的其他一些字段。

我一直试图用一串if语句来完成这个。它不是很漂亮,它只能在一组物体中运行一次。

if (!Light7.Status)
            {
                if (!Light6.Status)
                {
                    if (!Light5.Status)
                    {
                        if (!Light4.Status)
                        {
                            if (!Light3.Status)
                            { 
                                if (!Light2.Status)
                                {
                                    if (!Light1.Status)
                                    {
                                        if (!Light0.Status)
                                        {
                                            Light0.Email = newId;
                                            Light0.Status = true;
                                            Light0.Index = Id.IndexOf(newId);
                                            Light0.lightStart();
                                            Light1.Status = true;
                                        }
                                    }
                                    else
                                    {
                                        Light1.Email = newId;
                                        Light1.Status = true;
                                        Light1.Index = Id.IndexOf(newId);
                                        Light1.lightStart();
                                        Light2.Status = true;
                                    }
                                }
                                else
                                {
                                    Light2.Email = newId;
                                    Light2.Status = true;
                                    Light2.Index = Id.IndexOf(newId);
                                    Light2.lightStart();
                                    Light3.Status = true;
                                }
                            }
                            else
                            {
                                Light3.Email = newId;
                                Light3.Status = true;
                                Light3.Index = Id.IndexOf(newId);
                                Light3.lightStart();
                                Light4.Status = true;
                            }
                        }
                        else
                        {
                            Light4.Email = newId;
                            Light4.Status = true;
                            Light4.Index = Id.IndexOf(newId);
                            Light4.lightStart();
                            Light5.Status = true;
                        }
                    }
                    else
                    {
                        Light5.Email = newId;
                        Light5.Status = true;
                        Light5.Index = Id.IndexOf(newId);
                        Light5.lightStart();
                        Light6.Status = true;
                    }
                }
                else
                {
                    Light6.Email = newId;
                    Light6.Status = true;
                    Light6.Index = Id.IndexOf(newId);
                    Light6.lightStart();
                    Light7.Status = true;
                }
            }
            else
            {
                Light7.Email = newId;
                Light7.Status = true;
                Light7.Index = Id.IndexOf(newId);
                Light7.lightStart();
            }

有没有更好的方法来实现我的目标?我用c#进行了大约两周的旅程,所以我为自己的无知而道歉。

编辑:看起来我没有解释这个。

背景:我有一个名为BlinkStick的技术,我试图通过加载项使其成为Outlook的通知灯。我想要发生的是当第一封电子邮件进来时它打开灯1.然后当第二封电子邮件进来时它打开灯2等。当电子邮件的状态从未读到读取然后它转动灯与之相关的。如果其他灯处于活动状态,则会将这些灯移至上一个空间。因此Light 2将移动到Light 1,而Light 3将移动到Light 2。

这是所有灯光都基于的类。

class LightSuper
{
     public LightSuper()
    {

    }

    public LightSuper(byte i, bool e)
    {
        i = index;
        e = Status;
    }

    private static string email;

    public static string Email
    {
        get { return email; }
        set { email = value; }
    }

    private static byte index;

    public static int Index
    {
        get { return index; }
        set { index = Convert.ToByte(value+1); }
    }

    private static bool status;

    public static bool Status
    {
        get { return status; }
        set { status = value; }
    }

    public static void lightStart()
    {
        Thread start = new Thread(() => lightLoop(ref index, ref status));
        start.IsBackground = true;
        start.Start();
    }

    private static void lightLoop(ref byte index, ref bool state)
    {
        Stopwatch timer = new Stopwatch();

        BlinkStick device = BlinkStick.FindFirst();
        if (device != null && device.OpenDevice())
        {
            timer.Start();
            while (state)
            {
                if (timer.Elapsed.Minutes < 3)
                {

                    device.SetColor(0, index, "green");
                    Thread.Sleep(500);
                    device.SetColor(0, index, "black");
                    Thread.Sleep(500);

                }
                if (timer.Elapsed.Minutes >= 3 && timer.Elapsed.Minutes < 5)
                {
                    device.SetColor(0, index, "yellow");
                    Thread.Sleep(375);
                    device.SetColor(0, index, "black");
                    Thread.Sleep(375);
                }
                if (timer.Elapsed.Minutes >= 5)
                {
                    device.SetColor(0, index, "red");
                    Thread.Sleep(250);
                    device.SetColor(0, index, "black");
                    Thread.Sleep(250);
                }
            }
        }
    }
}

class Light0 : LightSuper
{
    public Light0()
    {

    }
}

class Light1 : LightSuper
{
    public Light1()
    {

    }
}

class Light2 : LightSuper
{
    public Light2()
    {

    }
}

class Light3 : LightSuper
{   
    public Light3()
    {

    }
}

class Light4 : LightSuper
{
    public Light4()
    {

    }
}


class Light5 : LightSuper
{
    public Light5()
    {

    }
}

class Light6 : LightSuper
{
    public Light6()
    {

    }
}

class Light7 : LightSuper
{
    public Light7()
    {

    }
}

我发现如果我每次创建一个新的SuperLight实例,我都无法直接编辑该特定实例,仍然可以在lightLoop中更新while循环而不关闭所有灯光。所以我创建了8个子类,以便可以单独编辑每个类对象。

如果有更好的方法可以做到这一点,我全都耳朵。

3 个答案:

答案 0 :(得分:2)

LINQ是完成此类任务的绝佳工具。您的代码可能如下所示:

List<SuperClass> lightList = {...} //Add light1, light2, etc to the list.
SuperClass light = lightList.FirstOrDefault(l => !l.Status);
if (light != null)
{
    light.Email = newId;
    //Set rest of proprties
}

或者,如果要更新列表中Status == false

的所有对象
List<SuperClass> lightList = {...} //Add light1, light2, etc to the list. You may also want to order this list?
foreach(SuperClass light in lightList.Where(l => !l.Status))
{
    light.Email = newId;
    //Set rest of proprties
}

答案 1 :(得分:1)

您的代码段的逻辑问题是,如果light7的状态为false,那么它将转到嵌套的if,它不会到达else语句,在那里它将设置相应的信息,这就是你想要的。因此,如果所有状态都是false,则只有Light0的属性会发生变化。从逻辑上讲,你希望你的if语句在这种情况下不具有!,因为如果它们是真的,你不希望改变Light的属性,你是&#39; d只是想检查下一个。

此外,您的灯光看起来都是各个类别,每个类别都具有完全相同的属性。我一定会研究如何创建单个类并从该单个类创建对象。

有关对象的文档:

  

https://msdn.microsoft.com/en-us/library/ms173110.aspx

我会研究循环和集合,特别是for循环和lists

两者的文件:

  

https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

     

https://msdn.microsoft.com/en-us/library/ch45axte.aspx

您可以将整个代码段减少到大约10行。

我首先会创建一个&#34;集合&#34;像这样的列表中的对象:

List<Light> lights = new List<Light>;

然后,将您的灯光对象添加到列表中:

lights.add(light)用每个灯替换light并为每次添加复制此行。

然后你想要&#34;迭代&#34;或循环遍历列表中的每个对象,如下所示:

foreach (int index = 0; index < lights.Count()-1; index++)
{
    if (!lights[i].Status)
    {
          lights[i].Email = newId;
          lights[i].Status = true;
          lights[i].Index = Id.IndexOf(newId);
          lights[i].lightStart();
          lights[i+1].Status = true;
          break;
    }
}

在这种情况下,您需要if语句中的!,因为如果状态为false,它将进入if语句,因为!转换了true条件的结果。反之亦然,如果是真的,它将变为假,并继续循环。

if语句块的最后一行中的break;语句将阻止我们搜索列表,因为它会破坏&#39;走出循环。

答案 2 :(得分:0)

LINQ与特定类的集合一起使用。 例如:

var lights = new List<Light>();
//Insert logic to add lights to the collection (eg. lights.Add(new Light());)
var firstLight = lights.FirstOrDefault(light => !light.Status);
if (firstLight != null)
{
    firstLight.Email = newId;
    firstLight.Status = true;
    firstLight.Index = Id.IndexOf(newId);
    firstLight.lightStart();
    firstLight.Status = true;
}