kskumaran Ответов: 3

Как получить отчетливое значение


Пример:
Kumar
Kumar1
Kumar2
123Kumar
2Kumar1
Muruga1
Muruga2
123Muruga
1Muruga3

результат:
Kumar,Muruga


Как решить. Не используется условие foreach? пожалуйста, помогите этому ответу.

Что я уже пробовал:

[Удалена дублирующая информация, уже представленная в тексте вопроса. Никаких SQL-команд или исходного кода не предусмотрено.]

Kornfeld Eliyahu Peter

1. Как это связано с SQL-сервером?
2. данные всегда числовые, смешанные с именем?
3. Что вы пробовали?

3 Ответов

Рейтинг:
2

Graeme_Grant

Может быть, это:

internal static class Program
{
    private static void Main()
    {
        var list = new List<string>() {
            "Kumar",
            "Kumar1",
            "Kumar2",
            "123Kumar",
            "2Kumar1",
            "Muruga1",
            "Muruga2",
            "123Muruga",
            "1Muruga3"
        };

        foreach (var result in list.Select(x => GetLongestMatch(x, list.Except(new List<string> { x }))).Distinct())
            Console.WriteLine($"{result.Key} was found {result.Value} time{(result.Value > 1 ? "s" : "")}");

        Console.WriteLine("-- done --");
        Console.ReadKey();
    }

    private static KeyValuePair<string, int> GetLongestMatch(string item, IEnumerable<string> list)
    {
        var results = new Dictionary<string, int>();
        foreach (string subStr in GetAllSubstrings(item).OrderByDescending(s => s.Length))
            results.Add(subStr, list.Count(s => s.Contains(subStr)) + 1);

        return results.OrderByDescending(x => x.Value).FirstOrDefault();
    }

    public static IEnumerable<string> GetAllSubstrings(string word)
        => from ndx1 in Enumerable.Range(0, word.Length)
            from ndx2 in Enumerable.Range(0, word.Length - ndx1 + 1)
            where ndx2 >= 2
            select word.Substring(ndx1, ndx2);
}

Выводит это:
Kumar was found 5 times
Muruga was found 4 times
-- done --

Это то, что вы ищете...


Рейтинг:
1

OriginalGriff

В значительной степени вы не можете: там нет никаких определенных ценностей - или, скорее, все они являются различными ценностями.
А пытаться искать строки, содержащие другие строки, в SQL ужасно-обработка строк в лучшем случае примитивна, и вам нужно удалить все не-альфа-символы.
Сделайте это на языке презентации, и это довольно просто (если все еще неприятно выглядит):

string[] names = { "Kumar", "Kumar1", "Kumar2", "123Kumar", "2Kumar1", "Muruga1", "Muruga2", "123Muruga", "1Muruga3" };
string[] distinct = names.Select(n => new string((n.Where(c => char.IsLetter(c))).ToArray())).Distinct().ToArray();


Graeme_Grant

5-й! Красиво и аккуратно!

[редактировать] Это отменяется, если совпадение содержит не буквы... Хм... не ясно, является ли это проблемой или нет, основываясь на расплывчатости вопроса....

Рейтинг:
0

RickZeeland

CREATE TABLE yourtable
	([ID] int, [User] varchar(10), [Department] varchar(8))
;
	
INSERT INTO yourtable
	([ID], [User], [Department])
VALUES
	(1, 'User1', 'Admin'),
	(2, 'User1', 'Accounts'),
	(3, '1User2', 'Finance'),
	(4, 'User3', 'Sales'),
	(5, '123User3', 'Finance')
;

select distinct REPLACE(REPLACE(REPLACE(t.[user], '1', ''), '2', ''), '3', '')
from yourtable t;

Попробуйте это онлайн на: Скрипка SQL[^]


RedDk

Это правильный ответ.

RickZeeland

Вы правы :)

itsmypassion

Он работал