2016-05-10 1 views
1

Scheint, ich überprüfe, ob die Id alle in einer Runde-über-Weg sind, gibt es eine prägnantere und einfach zu verstehen Weg, um die Prüfung zu tun?Überprüfen Sie alle Eigenschaften in der Liste der Objekte ist gleich

So etwas wie eine vollständige äußere Verbindung und Überprüfung auf Nullen?

Insbesondere dieser Teil:

if (masters1.Count() != masters1.Intersect(masters2).Count()) 
{ 
    throw new Exception("one IDs did not match two IDs"); 
} 

if (masters2.Count() != masters2.Intersect(masters3).Count()) 
{ 
    throw new Exception("two IDs did not match three IDs"); 
} 

Voll Beispiel:

using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data.SqlClient; 
using System.Linq; 


     public class Record 
     { 
      public string Id; 
      public string Value; 
     } 

     public class Records 
     { 
      public Record One; 
      public Record Two; 
      public Record Three; 
     } 

public class Program 
{ 
    public static void Main() 
    { 
     var one = new List<Record>(){new Record(){Id = "one", Value = "1"},new Record(){Id = "two", Value = "2"}}; 
     var two = new List<Record>(){new Record(){Id = "one", Value = "1"},new Record(){Id = "two", Value = "2"}}; 
     var three = new List<Record>(){new Record(){Id = "one", Value = "1"},new Record(){Id = "two", Value = "2"}}; 

     var masters1 = one.Select(x => x.Id); 
     var masters2 = two.Select(x => x.Id); 
     var masters3 = three.Select(x => x.Id); 


     if (masters1.Count() != masters1.Intersect(masters2).Count()) 
     { 
      throw new Exception("one IDs did not match two IDs"); 
     } 

     if (masters2.Count() != masters2.Intersect(masters3).Count()) 
     { 
      throw new Exception("two IDs did not match three IDs"); 
     } 

     var rv = new List<Records>(); 
     foreach (var master in masters1) 
     { 
      var record = new Records() 
      { 
       One = one.Single(x => x.Id == master), 
       Two = two.Single(x => x.Id == master), 
       Three = three.Single(x => x.Id == master), 
      }; 

      rv.Add(record); 
     } 


     foreach(var x in rv){ 
      Console.WriteLine(x.One.Value); 
      Console.WriteLine(x.Two.Value); 
      Console.WriteLine(x.Three.Value); 
     } 

    } 
} 

Siehe hier: https://dotnetfiddle.net/QtjM7x

Antwort

1

AFAIU, Sie so etwas wie this benötigen. So wird der Code wie folgt sein:

if (masters1.SequenceEqual(masters2)) DoSomething(); 

Beachten Sie, dass SequenceEqual die Standardgleichheits comparers verwendet, so dass Sie Equals(), um außer Kraft setzen müssen, um benutzerdefinierte Vergleichslogik hinzuzufügen.

+0

Weil Masters1 und Masters2 nur eine Liste von Strings sind, dann müssen Sie keinen benutzerdefinierten Equals machen, oder? – LearningJrDev

+0

Ja! In Ihrem Fall - genau :) –

+0

Sie könnten aber auch Equals() in Ihrer Record-Klasse überschreiben - so dass Sie diese nicht benötigen. Wählen Sie (x => x.Id) Anrufe –

Verwandte Themen