我有八个对象是超类的子类。它们都共享相同的字段和属性。我想要做的是以某种方式迭代这组对象并找到第一个将其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个子类,以便可以单独编辑每个类对象。
如果有更好的方法可以做到这一点,我全都耳朵。
答案 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只是想检查下一个。
此外,您的灯光看起来都是各个类别,每个类别都具有完全相同的属性。我一定会研究如何创建单个类并从该单个类创建对象。
有关对象的文档:
我会研究循环和集合,特别是for
循环和lists
。
两者的文件:
https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).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;
}