2016-12-28 12 views
2

のためのLINQ式を探して、私は "IsExist" の現在の値が今、 "デバイス1 []" アレイ、foreachループ

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

ための "偽" である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; } 
} 

を持っています"デバイス2は、[]" 配列は、今

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

が、私は両方の配列を比較しています "IsExistを"、持っていない "デバイス1 []" と "デバイス2 []" DeviceNの場合、2 "foreachの" ループを使用して、 ameとDeviceIPは同じですが、 "IsExist" = "true"にリセットしています。

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

答えて

3

LINQのはを更新ないを照会ためのものですので、あなたは 1のLINQとforeach内側のループを置き換えることはできませんが。あなたが持っていることは(d2試合で任意の項目この条件のでしょうか?)基本的にAnyクエリです:

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

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

に必要な項目を見つけることIntersectJoinWhereなどを使用して別の方法があるかもしれません更新することができますが、最後にforeachループがそれらを更新する適切な方法です。

+0

負の有権者..説明してください。 – Marshal

3

あなたが参加しようとしているようです。 、

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; 
+0

非常に良い。ここの唯一のバージョンは、その混乱をオリジナルよりも私に読みやすくしました。私は通常ドットシンタックスがもっと好きです。しかし、これは本当にSQLのような力を示しています。 :-) –

0

両方がリスト(配列にキャストタイプ)ですので、あなたが最初のリストを反復処理するためにList.ForEachを使用することができます:あなたは、LINQでそれを行うことができますが、まだ結果にIsExistを更新するforeachが必要になりますAnyを使用して内部リストを反復処理します。

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

この1つのソリューションと他のすべてのソリューションは、2つのレベルの繰り返しを使用し、既存のソリューションの簡略化されたものです。あなたはそれで逃げることはできません。

+0

shorthandsに感謝します –

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

ワンライナー

d1.Where(dev1=> d2.Any(dev2=>dev2.DeviceName == dev1.DeviceName && 
          dev2.DeviceIP == dev1.IP)) 
    .ToList() 
    .ForEach(dev1=>dev1.IsExist = true); 

最終出力

d1.Dump(); //LinqPad feature 

enter image description here

+0

すばらしい、ありがとう –

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