2016-01-25 1 views
-1

У меня есть эти имена:Как проверить, следует ли за другим элемент в списке? C#

Sean 
Winnie 
Brian Amy 
Samir 
Joe Bethany 
Bruno Anna Matthew Lucas 
Gabriel Martha Philip 
Andre 
Danielle 
Leo Cinthia 
Paula 
Mary Jane 
Anderson 
Priscilla 
Regis Julianna Arthur 
Mark Marina 
Alex Andrea 

упражнение говорит, что имена, разделенные пробелом в строке, не могут давать подарки друг другу. Как Лео не может давать подарки Cinthia, Джо не может дать за Бетани и т. Д.

Так что я ищу код, который я могу использовать, чтобы проверить, что если у меня есть список, и строки импортируются в это список, то я хочу проверить, есть ли определенная строка (например, за Лео следует Cinthia), а затем пространство, то эти два человека не могут давать подарки друг другу.

До сих пор я здесь:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 

namespace SecretSanta 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StreamReader File = new StreamReader("SSfile.txt"); 
      List<string> Names = new List<string>(); 
      string line = File.ReadLine(); 

      while (line != null) 
      { 
       Console.WriteLine(line); 
       line = File.ReadLine(); 
       Names.Add(line); 
      } 

      Console.ReadKey();  
     } 
    } 
} 
+2

И каков ваш вопрос? – acostela

+0

Так что я ищу код, который я могу использовать, чтобы проверить, что, если у меня есть список, и строки импортируются в этот список, то я хочу проверить, есть ли определенная строка (например, за Лео следует Cinthia). по пространству, то эти два человека не могут давать друг другу подарки. –

+0

Множество вещей, которые вы могли бы сделать здесь, но вот быстрый фрагмент, который может указать вам в правильном направлении: 'var names = line.Split (" ", StringSplitOptions.RemoveEmptyEntries)'. – CodingGorilla

ответ

-2

Дело в том, что она не будет работать таким образом в моем понимании проблемы.

У вас есть список с { «Sean», «Винни», ... «Джо», Бетани '} Так что, если вы проверяете, если Джо следует Вифании, а затем запретить его, чтобы дать подарки в Вифанию , вы также запретили бы Шон давать подарки Винни ... Думаю, вам нужно больше, чем один список для достижения этой функциональности. Возможно, вы можете использовать список, содержащий списки, содержащие людей в одной строке , например. {{'Sean'}, {'Winnie'}, ..., {'Joe', Bethany '}}

Надеюсь, я правильно понял вашу проблему.

+0

Я думаю, вы поняли мою проблему. Это называется двумерным списком? –

+0

Намного проще, просто использовать один «Список », а затем использовать 'String.Split()', чтобы узнать, есть ли в каждой записи несколько имен. Использование нескольких списков или вложенных списков усложняет его без необходимости. – Tim

+0

@JohnDale Ваш вопрос не предполагает, что это так. –

1
class Program 
    { 
     static Dictionary<string, List<string>> Names = new Dictionary<string, List<string>>(); 
     static void Main(string[] args) 
     { 
      StreamReader File = new StreamReader("SSfile.txt"); 
      string line = File.ReadLine(); 
      while (line != null) 
      { 
       Console.WriteLine(line); 
       line = File.ReadLine(); 
       var names = line.Split(" ", StringSplitOptions.RemoveEmptyEntries) 
       Names.Add(names[0], names.Skip(1).ToList()); 
      } 
      Console.ReadKey(); 
     } 

     static bool canGive(giver, givee) 
     { 
      return Names[giver].Any(item => item == givee); 
     } 
    } 
+0

Хороший ответ, хотя «Словарь» является излишним. Коллекция «KeyValuePair» гораздо более подходит для этого случая. Вы отвечаете на сложность O (n), что отлично, но если вы замените словарь простым «List », вы получите еще лучшие результаты. –