2015-07-27 2 views
0

У меня есть СПИСОК с двумя АТРИБУТЫ/ОБЪЕКТЫ. Первый IS INT-ARRAY для двух идентификаторов.Array-List не содержит

Я хочу, чтобы добавить новый объект в список, только если значение и (только в комбинации) не будет существовать в ИДС-массив СПИСКА отверстия. // если будет найден только один ID, все будет в порядке - только комбинация обоих идентификаторов должна перейти в ELSE-Case. :)

* 12 и 21 будет вары позже, поэтому не статические значения

Я не знаю, почему, но это не работает ...

если (Id! = Destination. Id & & ! (ThisDistances.Exists (х => x.Ids.Contains (12)) & & ThisDistances.Exists (х => x.Ids.Contains (21)))) {...}

public class DistanceData 
{ 
    public int[] Ids; 
    public int Distance; 
} 

protected void MakeDistances(int Id, double GeoLat, double GeoLon, int Limit = 100) 
{ 
    int i = 0; 
    List<DistanceData> ThisDistances = new List<DistanceData>(); 
    foreach (var Destination in Destinations) 
    { 
     if (Id != Destination.Id && !(ThisDistances.Exists(x => x.Ids.Contains(12)) && ThisDistances.Exists(x => x.Ids.Contains(21)))) 
     { 
      ThisDistances.Add(new DistanceData() 
      { 
       Ids = new int[2] { Id, Destination.Id }, 
       Distance = (int)Math.Round(6378388 * Math.Acos(Math.Sin(GeoLat) * Math.Sin(Destination.GeoLat) + Math.Cos(GeoLat) * Math.Cos(Destination.GeoLat) * Math.Cos(Destination.GeoLon - GeoLon)), 0, MidpointRounding.AwayFromZero) 
      }); 
      if (++i > 10) break; 
     } 
    } 
    ThisDistances = ThisDistances.OrderBy(x => x.Distance).Take(Limit).ToList(); 
    foreach (var ThisDistance in ThisDistances) 
    { 
     Response.Write("<i><b>" + ThisDistance.Distance + "</b> (" + ThisDistance.Ids[0] + "," + ThisDistance.Ids[1] + ")</i><br />"); 
    } 
} 

Как я могу проверить, что Идентификаторы НЕ находятся в ID-массиве ObjectList?

+4

Research Булева алгебра: '(существует (а) && существует (б))' 'это существует (а) ||! ! Существует (б) '. Вы хотите '! Exists (a) &&! Exists (b)', который является '! (Существует (a) || существует (b))'. –

+0

Вы также можете использовать 'false' вместо восклицательного знака, который некоторые люди находят более выразительным. – Greg

+0

@RogerLipscombe в 2 словах: De-morgan. –

ответ

0

попробовать это одно:

foreach (var Destination in Destinations) 
{ 
    if (Id != Destination.Id && (ThisDistances.Exists(x => x.Ids.Contains(12) && x.Ids.Contains(21)) == false)) 
    { 
     ThisDistances.Add(new DistanceData() 
     { 
      Ids = new int[2] { Id, Destination.Id }, 
      Distance = (int)Math.Round(6378388 * Math.Acos(Math.Sin(GeoLat) * Math.Sin(Destination.GeoLat) + Math.Cos(GeoLat) * Math.Cos(Destination.GeoLat) * Math.Cos(Destination.GeoLon - GeoLon)), 0, MidpointRounding.AwayFromZero) 
     }); 
     if (++i > 10) break; 
    } 
} 
Смежные вопросы