2013-09-04 2 views
0

У меня есть списокувидеть, если любой элемент существует в любом элементе списка

 List<FirstIterationCapacitors> FirstIteration = new List<FirstIterationCapacitors>(); // A set of Solution capacitors object 

Вот это класс

class FirstIterationCapacitors 
    { 
     public int Iteration { get; set; } 
     public int CapacitorALocation { get; set; } 
     public int CapacitorBLocation { get; set; } 
     public int CapacitorCLocation { get; set; } 
    } 

Теперь у меня есть второй список

 List<PossibleSolutionCapacitors> PossibleSolution = new List<PossibleSolutionCapacitors>(); // Possible Solution capacitors object 

здесь является класс

class PossibleSolutionCapacitors 
    { 
     public int CapacitorALocation { get; set; } 
     public int CapacitorBLocation { get; set; } 
     public int CapacitorCLocation { get; set; }  

    } 

Для данной строки (т.е. для строки 2) в PossibleSolution мне нужно, чтобы увидеть, если

  1. PossibleSolution.CapacitorALocation не существует в FirstIteration.CapacitorALocation (т.е. равный итерации X) или FirstIteration.CapacitorBLocation (равный итерации X) или FirstIteration.CapacitorCLocation (равный итерации X)

ИЛИ

  1. PossibleSolution.CapacitorBLocation не существует в FirstIteration.CapacitorALocation (что равно итерации X) или FirstIteration.CapacitorBLocation (что равно итерации X) или FirstIteration.CapacitorCLocation (что равно итерации X)

ИЛИ

  1. PossibleSolution.CapacitorCLocation сделать х годов не существует в FirstIteration.CapacitorALocation (что равно итерации X) или FirstIteration.CapacitorBLocation (что равно итерации X) или FirstIteration.CapacitorCLocation (что равно итерации X)

идеале булево о том, правда, ложь, если условие истинно/ложно

Вот что я пытался до сих пор, но он не работает

int D = 4; // The row i care about 

int E = PossibleSolution[D].CapacitorALocation; 
int F = PossibleSolution[D].CapacitorBLocation; 
int G = PossibleSolution[D].CapacitorCLocation; 



var fixedSet = new HashSet<int>() {E}; 
if (!FirstIteration.Any(x => fixedSet.SetEquals(new[] { x.CapacitorALocation, x.CapacitorBLocation, x.CapacitorCLocation }))) 
{ 
fixedSet = new HashSet<int>() {F}; 
if (!FirstIteration.Any(x => fixedSet.SetEquals(new[] { x.CapacitorALocation, x.CapacitorBLocation, x.CapacitorCLocation }))) 
{ 

fixedSet = new HashSet<int>() {G}; 
if (!FirstIteration.Any(x => fixedSet.SetEquals(new[] { x.CapacitorALocation, x.CapacitorBLocation, x.CapacitorCLocation }))) 
{ 

//Match does not exist so do some real work here ...... 

} 

} 

} 

Спасибо, damo

+1

Что делают SetEquals? –

+0

Посмотрите это решение вчера вечером на аналогичную проблему - http://stackoverflow.com/questions/18601502/list-permutation-existance – user1438082

+3

@LeoLorenzoLuis Возвращает true, если два набора имеют одинаковые элементы, а false, если они этого не делают. Подумайте об этом как о «SequenceEquals», который не требует, чтобы элементы находились в одном порядке. – Servy

ответ

1

Поскольку во всех трех ваших условиях проверить, если в определенном месте

не существует в FirstIteration.CapacitorALocation или FirstIteration.CapacitorBLocation или FirstIteration.CapacitorCLocation

вы можете собрать все эти места в одном Set<int> для быстрой проверки:

var firstIterationLocations = new HashSet<int>(
    firstIterationCapacitorList 
    .Where(loc => loc.Iteration == X) 
    .SelectMany(
     loc => new[] {loc.CapacitorALocation, loc.CapacitorBLocation, loc.CapacitorCLocation} 
    ) 
); 

С firstIterationLocations в руке, вы можете построить свое состояние следующим образом:

if (!(firstIterationLocations.Contains(PossibleSolution[D].CapacitorALocation) 
|| firstIterationLocations.Contains(PossibleSolution[D].CapacitorBLocation) 
|| firstIterationLocations.Contains(PossibleSolution[D].CapacitorCLocation)) 
) { 
    ... 
} 
+0

это не работает - вы уверены, что var firstiter ... верен - он возвращает массив какого-то типа, но не список трио каждого конденсаторного местоположения - также в каждом OR-заявлении есть! перед первым словом? – user1438082

+1

@ user1438082 Он добавляет все местоположения в один набор, потому что все ваши проверки проверяют, что местоположение 'A',' B' или 'C' не входит ни в одно из мест с первой итерации; поэтому я поместил их всех в один набор. Что касается '!', Это перед выражением в скобках, а не перед первым элементом, поэтому должен быть только один. – dasblinkenlight

+0

Он работает, я думаю - одно небольшое изменение - мне нужно только var firstIterationLocations использовать loc.CapacitorALocation, loc.CapacitorBLocation, loc.CapacitorCLocation где Iteration = X (см. Класс FirstIterationCapacitors для его определения), я также обновлю вопрос. – user1438082

-1

Так что вы хотите знать, если какой-либо элемент в первом наборе местоположений находится во втором наборе местоположений.Вы можете думать о том, что, как спрашивать, если пересечение двух множеств имеет какие-либо предметы:

public static bool Match(FirstIterationCapacitors first 
    , FirstIterationCapacitors second) 
{ 
    return new[]{ 
     first.CapacitorALocation, 
     first.CapacitorBLocation, 
     first.CapacitorCLocation 
     }.Intersect(new[]{ 
      second.CapacitorALocation, 
      second.CapacitorBLocation, 
      second.CapacitorCLocation, 
     }) 
     .Any(); 
} 
+0

Он выглядит для пересечения или разницы? Если его отличие, чем вы можете обменять метод Intersect с помощью метода Except –

+0

@BrettSanderson Пересечение. Он хочет знать, находятся ли какие-либо предметы в первом наборе во втором. Если бы это была заданная разница, которая спрашивала бы: «Все ли элементы в первом наборе во втором?» который, по-видимому, не является тем, что он хочет, исходя из вопроса. – Servy

+0

Он хочет, если какой-либо элемент в A не существует в B, это кажется тем, что он сказал. Я не знаю, это простое решение, чтобы все испортить, поэтому я проголосовал за это. –

Смежные вопросы