我有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;
}
}
}
答案 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));
}
,Intersect
,Join
等可能有其他方式来查找需要更新的项目,但最后还是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()
答案 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();