2016-05-10 3 views
0

Я использую таблицы для хранения имен объектов раздела one. Мой вопрос в том, как я могу вставить имена предметов из одной таблицы в другую таблицу таким образом, чтобы в тот же час не было двух предметов.Вставка данных в таблицы путем сравнения

Пример:

Table-1 

Hour  Subject-name 

1   C# 
2   Java 
3   OS 
4   C++ 
5   DBMS 

мне нужно ввести тот же набор значений в другой таблице сказать, table-2 таким образом:

Table-2 

Hour   Subject-name 

1    OS 
2    DBMS 
3    C# 
4    Java 
5    C++ 

Я использовал перетасовать операцию для списка в чтобы случайным образом перемешать элементы. Но есть возможность появления одной и той же темы дважды.

public static void Shuffle<T>(IList<T> list) 
{ 
    int n = list.Count; 
    while (n > 1) 
    { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 
} 
+0

содержат ли таблица 1 Четкие Предметные имена? Если это так, Shuffle должен только произвольно упорядочивать элементы и не должен приводить к каким-либо дубликатам. – user3185569

+0

Дубликат, вы имеете в виду запись в таблице 2, то же самое в таблице 1? – user3185569

+0

Да, таблица 1 содержит отдельные предметы. Кроме того, да, тасовка не приводит к дублированию. Но проблема с функцией тасования заключается в следующем: поскольку он перемещается случайным образом, нет никакой гарантии, что таблица-1 и таблица-2 будут иметь уникальный порядок все время. @ user3185569 – Prithvi

ответ

0

Вы должны Перетасовке, а затем проверить, если ваш правило нарушается и повторите попытку.

Ниже один подход к выполнению этого:

Random rng = new Random(); 
private IList<Course> SmartShuffle(IList<Course> oldList) 
{ 
    IList<Course> newList = new List<Course>(); 
    while (true) 
    { 
     var randomOrder = oldList.OrderBy(x => rng.Next()).ToList(); 

     int counter = 0; 
     foreach(var course in oldList) 
     { 
      newList.Add(new Course() { Name = randomOrder[counter].Name, Hour = course.Hour }); 

      counter++; 
     } 

     int differenceCount = newList.Count(n => oldList.Any(o => o.Name == n.Name && o.Hour != n.Hour)); 

     // leave only one of the below if statements 

     // case at least 1 element should be different 
     if (differenceCount > 0) 
      break; 

     // case all elements must be different 
     if (differenceCount == oldList.Count) 
      break; 
    } 

    return newList; 
} 

public class Course 
{ 
    public string Name { set; get; } 
    public int Hour { set; get; } 
} 
Смежные вопросы