C# сопоставление двух данных

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Имеем таблицу с данными. Несколько столбцов и тысячи строк.
В одном столбце имена повторяющиеся, например:
Джон
Фрэд
Фрэд
Майкл
Джон

И нужно мне добавить ещё один столбец из списка, чтобы брал случайные строки, но сопоставление имен сохранялось. Например:
Джон Иван
Фрэд Федя
Фрэд Федя
Майкл Миша
Джон Иван

И никак не могу найти простого решения задачи. Что посоветуете?
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Имеем таблицу с данными. Несколько столбцов и тысячи строк.
В одном столбце имена повторяющиеся, например:
Джон
Фрэд
Фрэд
Майкл
Джон

И нужно мне добавить ещё один столбец из списка, чтобы брал случайные строки, но сопоставление имен сохранялось. Например:
Джон Иван
Фрэд Федя
Фрэд Федя
Майкл Миша
Джон Иван

И никак не могу найти простого решения задачи. Что посоветуете?
Брр, а в чем тут проблема ?

1. Выбираем только уникальные значения имен
2. Подставляем каждому уникальному имени что хотим
3. Обновляем все имена в таблице на подставленные
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
2. Подставляем каждому уникальному имени что хотим
Весь вопрос в этом. Цитирую заголовок "C# сопоставление двух данных". Какие классы или коллекции можно приспособить для этого?
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83
в каждом столбце одинаковое количество строк?
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

dr1veq

Пользователь
Регистрация
09.02.2018
Сообщения
39
Благодарностей
44
Баллы
18
Весь вопрос в этом. Цитирую заголовок "C# сопоставление двух данных". Какие классы или коллекции можно приспособить для этого?
Dictionary мб, 1 имя - ключ, 2 имя - значение. Если имя уже есть - берём по ключу, если нет - добавляем новый с рандомным 2 именем.
 
  • Спасибо
Реакции: Astraport

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Dictionary мб, 1 имя - ключ, 2 имя - значение. Если имя уже есть - берём по ключу, если нет - добавляем новый с рандомным 2 именем.
Ну вот что-то подобное я делал на другом языке, поэтому выше написал про коллекции, а на шарпе даже не знаю как лучше всё организовать.
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Может кому пример кода понадобится, т. к. задача нужная, а решение не простое.
Работает быстро.
PHP:
Dictionary<string, string> dict = new Dictionary<string, string>();
var t = project.Tables["a"];
var users = project.Lists["temp"];
var profiles = project.Lists["users"];

if (profiles.Count < users.Count) {
    return -1;
}
for (int k = 0; k < users.Count; k++) {
    dict.Add(users[k], profiles[k]);
}
string str = "";
for (int i = 0; i < t.RowCount; i++) {
    str = t.GetCell("C", i);
    foreach (KeyValuePair<string, string> pair in dict){
        if (pair.Key == str) {
            t.SetCell("E", i, pair.Value);
        }
    }
}
 
  • Спасибо
Реакции: erbuz и ftbwork10

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Может кому пример кода понадобится, т. к. задача нужная, а решение не простое.
Работает быстро.
PHP:
Dictionary<string, string> dict = new Dictionary<string, string>();
var t = project.Tables["a"];
var users = project.Lists["temp"];
var profiles = project.Lists["users"];

if (profiles.Count < users.Count) {
    return -1;
}
for (int k = 0; k < users.Count; k++) {
    dict.Add(users[k], profiles[k]);
}
string str = "";
for (int i = 0; i < t.RowCount; i++) {
    str = t.GetCell("C", i);
    foreach (KeyValuePair<string, string> pair in dict){
        if (pair.Key == str) {
            t.SetCell("E", i, pair.Value);
        }
    }
}
Так чуть покороче, и побыстрее:
Код:
var t = project.Tables["a"];
var users = project.Lists["temp"].ToArray();
var profiles = project.Lists["users"].ToArray();

if (profiles.Length < users.Length)
    return -1;

for (int i = 0; i < t.RowCount; i++)
{
    var idx = Array.BinarySearch(users, t.GetCell("C", i));
    if (idx >= 0)
        t.SetCell("E", i, profiles[idx]);
}
 
Последнее редактирование:

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)