寻找foreach循环的

时间:2016-12-28 15:08:01

标签: c#

我有2个设备类,

public class Device1
{
    public string DeviceName { get; set; }
    public string IP { get; set; }
    public bool IsExist { get; set; }
}
public class Device2
{
    public string DeviceName { get; set; }
    public string DeviceIP { get; set; }
}

" IsExist"的当前值是"假" for" Device1 []"阵列

private static Device1[] GetDevice1Arr()
    {
        List<Device1> d1List = new List<Device1>() {
            new Device1 { DeviceName="d1", IP="1", IsExist=false},
            new Device1 { DeviceName="d2", IP="1", IsExist=false}
        };

        return d1List.ToArray();
    }

现在&#34; Device2 []&#34;数组没有&#34; IsExist&#34;,

 private static Device2[] GetDevice2Arr()
    {
        List<Device2> d2List = new List<Device2>() {
            new Device2 { DeviceName="d1", DeviceIP="3"},
            new Device2 { DeviceName="d2", DeviceIP="1"},
            new Device2 { DeviceName="d2", DeviceIP="2"},
            new Device2 { DeviceName="d3", DeviceIP="3"}
        };

        return d2List.ToArray();
    }

现在我正在比较两个数组&#34; Device1 []&#34;和&#34; Device2 []&#34;通过使用2&#34; foreach&#34;循环,如果DeviceName和DeviceIP相同,我正在重置&#34; IsExist&#34; =&#34; true&#34;。

在此处或任何其他方式寻找LINQ替换。谢谢!

Device1[] d1 = GetDevice1Arr();
Device2[] d2 = GetDevice2Arr();

foreach(var device1 in d1)
{
    foreach(var device2 in d2)
    {
        if(device2.DeviceName == device1.DeviceName && device2.DeviceIP == device1.IP)
        {
            device1.IsExist = true;
        }
    }
}

6 个答案:

答案 0 :(得分:3)

您可以使用Linq替换内部 foreach循环,但不能替换外部循环,因为Linq用于查询而不是< EM>更新。您拥有的内容基本上是Any查询(<{1}}中的任何项与此条件匹配吗?):

d2

使用Device1[] d1 = GetDevice1Arr(); Device2[] d2 = GetDevice2Arr(); foreach(var device1 in d1) { device1.IsExist = d2.Any(device2 => device2.DeviceName == device1.DeviceName && device2.DeviceIP == device1.IP)); } IntersectJoin等可能有其他方式来查找需要更新的项目,但最后还是Where循环是更新它们的正确方法。

答案 1 :(得分:3)

看起来你正在尝试加入。您可以在LINQ中执行此操作,但是您仍然需要foreach来更新IsExist结果:

var itemsToUpdate = from d1 in GetDevice1Arr()
                    join d2 in GetDevice2Arr()
                         on new { d1.DeviceName, d1.IP }
                         equals new { d2.DeviceName, IP = d2.DeviceIP }
                    select d1;

foreach(var d1 in itemsToUpdate)
    d1.IsExist = true;

答案 2 :(得分:3)

单线

d1.Dump(); //LinqPad feature

最终输出

import pandas as pd
df = pd.DataFrame(your_list)
# filter bol == True only
df = df.loc[df['bol'] == True]
df['value'].max()

enter image description here

答案 3 :(得分:0)

由于两者都是list(类型转换为数组),因此可以使用List.ForEach迭代第一个列表,使用Any迭代内部列表。

d1.ForEach( d=> d.IsExist = d2.Any(x => x.DeviceIP == d.IP && x.DeviceName == d.DeviceName);

这个和所有其他解决方案使用两个级别的迭代,并且只是现有解决方案的缩写。你无法摆脱它。

答案 4 :(得分:0)

使用联接的另一个建议,但作为模拟的“左”联接得到真或假:

Device1[] d1 = GetDevice1Arr();
Device2[] d2 = GetDevice2Arr();

foreach(var d in from dev1 in d1
    join dd in d2 on new {dev1.DeviceName, dev1.IP} equals new {dd.DeviceName, IP = dd.DeviceIP} into d3    
    select new {dev1, Exists = d3.Any()})
    d.dev1.IsExist= d.Exists;

答案 5 :(得分:0)

  d1.Where(x => d2.Any(y => x.IsExist = (x.DeviceName == y.DeviceName && x.IP == y.DeviceIP))).ToList();