« first day (802 days earlier)      last day (2229 days later) » 

1:23 PM
@VladD, как вы относитесь к использованию расширений разметки в WPF для сокращения этой самой разметки?
3
Q: Рефакторинг XAML-разметки

АндрейЧитаю Роберта Мартина и пытаюсь постичь все тонкости рефакторинга. Если с C#-кодом все более-менее понятно и код мало-помалу начинает радовать глаз, то с XAML всё печально. Разметка громоздкая и трудночитаемая. Понятно, что многое связано с xml-"наследственностью". Xml избыточен и не очень прият...

Позволяет иногда неплохо укоротить код. В качестве развития темы этого вопроса:
Вот коротенькая статья, на примере конвертеров:
Правда там непонятно зачем синглтон сочиняют, я пишу просто: public override object ProvideValue(IServiceProvider serviceProvider) => this;
Вообще можно такую базу для конвертера сделать:
abstract class ConverterBase : MarkupExtension, IValueConverter
{
	public abstract object Convert(object value, Type targetType, object parameter, CultureInfo culture);

	public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
	{
		throw new NotImplementedException();
	}

	public override object ProvideValue(IServiceProvider serviceProvider) => this;
}
 
1:54 PM
А вот еще, например, часто надо привязаться к команде, которая лежит в корневой VM из какого-нибудь ItemsSource, тогда надо писать типа {Binding DataCintext.MyCommand, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}
Тогда можно написать расширение разметки, примерно такое:
class PwBindingExtension : MarkupExtension
{
	string _path;

	public PwBindingExtension(string path)
	{
		_path = path;
	}

	public override object ProvideValue(IServiceProvider serviceProvider)
	{
		return
			new Binding(_path)
			{
				RelativeSource = new RelativeSource(RelativeSourceMode.FindAncestor)
				{
					AncestorType = typeof(Window)
				}
			}.ProvideValue(serviceProvider);
	}
}
и сам код привязки сократится до примерно такого: {c:PwBinding DataContext.MyCommand}
Что дает +100 к лаконичности
 
2:53 PM
Добрый вечер!
 
Добрый вечер
 
Нужна помощь.
        var _MistakeAll = from a in ire.TimeTable
                          from b in ire.TimeTable
                          where (a.id != b.id) && (a.id_auditori != null && b.id_auditori != null && a.den != null && a.para != null && b.den != null && b.para != null) && a.den == b.den && a.para == b.para && (a.nedelya > 2 || b.nedelya > 2 || a.nedelya == b.nedelya) && (a.id_auditori == b.id_auditori || a.id_teacher == b.id_teacher)
                          select a;
У меня есть вот этот запрос. Я пытаюсь найти строки в которых значения в определенных столбцах совпадают. Пытался сделать это как описано выше. Будет ли это правильно?
 
Контекст:
0
A: Найти строки в которых значение столбцов совпадают linq

Foggy FinderДля группировки данных по определенному значению мы можем использовать метод GroupBy .GroupBy(x => new { x.Value1, x.Value2 }) Перечисляем все те столбцы, которые нас интересуют Пример Класс class SomeClass { public int Value1 { get; set; } public int Value2 { get; set; } publ...

 
Это я и писал
 
Да, я понимаю, для тех участников чата, которые не видел вопрос
 
2:57 PM
Простите))
Мне нужно получить набор этих одинаковых строк.
 
не специалист по производительности, но как уже писал в комментариях, если скорость критична, то я бы перенес отбор на сторону БД
 
Когда все обрабатывает linq меня производительность устраивает. А когда я туда подключаю циклы то уже висит долго
 
не может быть :)
как использовать linq я написал в ответе
мне кажется это как раз то, что вам было нужно или я ошибся?
 
Не думаю, что вы ошиблись. У вопросы по коду
1. var group = data.GroupBy(x => new { x.Value1, x.Value2 }); Для чего вы групперует по этим двум значениям?
 
это просто пример
вместо Value1, Value2 вы можете написать те свойства которые вам нужны
то есть если вам нужно получить группы, у которых id_teacher, id_auditori, nedelya, para, den равны между собой, то перечисляете все эти свойства
 
3:15 PM
        List<TimeTable> _list = new List<TimeTable>();
        var group = ire.TimeTable.GroupBy(x => new { x.trNum, x.den,x.para,x.nedelya });
        foreach (var subgroup in group)
        {
            foreach (var value in subgroup)
            {
                _list.Add(value);
            }

        }
в _list у меня попадут только те которые похожи? А почему мы их не сравниваем?
 
я думал вам нужны группы значений, а не один список
@Vivus не уверен, что понял вопрос, что значит "мы их не сравниваем?"
 
Я видимо всех запутал.)
Давайте сначала.
Это у меня расписание занятий и мне нужно найти совпадения по аудитории и совпадения по преподавателю и предупредить составителя расписания, что одна аудитория в одно и то же время, назначена на две группы. Или тоже самое по преподавателю. Что у него в одно и то же время две пары в разных группах.
У меня есть день, пара, группа, аудитория и преподаватель.
Мне нужно найти те строки которые совпадают по этим свойствам. Если они совпадают и свойства id_gruppi у этих строк разные, значит совпадение.
Алгоритм у меня был таков. Я нахожу все совпадения. Если совпадения абсолютны (то есть совпадает все кроме Группы) это поток. (Одна пара для нескольких групп.)
 
мне казалось,что это должно быть учтено уже в самом алгоритме составления расписания
 
Если же есть отличия кроме Группы (например Часы или Дисциплина) то это совпадение
Дело в том, я это учел. Просто у именно для той группы на которую сейчас составляется расписание.
А тут я хочу вывести все совпадения.
Чтобы человек увидел все и начал раскидывать.
 
тогда нужно еще отсеять те, где нет повторений
.GroupBy(x => new { x.Value1, x.Value2 }).Where(x => x.Count() != 1).SelectMany(x => x)
 
3:38 PM
        var group = ire.TimeTable.GroupBy(x => new { x.den, x.para, x.nedelya, x.id_auditori }).Where(x => x.Count() != 1).SelectMany(x => x);
Вот так?
Мне нужно это делать только для тех строк в которых id_auditorii не равно null
 
3:49 PM
тогда добавьте фильтр перед GroupBy
.Where(x => x.id_auditorii != null)
 
4:05 PM
Спасибо огромное. Не буду больше красть Ваше время.
 
4:39 PM
@Vivus нет проблем - заходите и спрашивайте в любое время. Сообщество затем и нужно чтобы помогать друг другу
 
 
6 hours later…
10:56 PM
@Андрей Ну, хм. Вообще положительно, но с оговорками.
Главное не повредить читабельности.
Если можно сократить, и станет проще/понятнее, это хорошо.
А если станет непонятно, то плохо.
@Андрей Ага, где-то видел такую технику, наверное у вас. Очень симпатично выглядит. (Даже взял на вооружение.)
@Андрей Ну, если бы только назвать {x:ParentWindowBinding} или там {x:AncestorWindowBinding}, то получается совсем хорошо. А то PwBinding мне ни о чём не говорит.
> There are only two hard things in Computer Science: cache invalidation and naming things.
 

« first day (802 days earlier)      last day (2229 days later) »