La solución aceptada no es correcta en realidad.
Debe cambiar cuando la semana "se rompe", es decir, cuando considera que la semana termina o comienza, y la fórmula en la solución aceptada no.
Esto no es tan visible los lunes como el inicio de la semana, pero más si se considera el jueves al final de la semana.
fórmula correcta es (para un jueves como del final del día):
DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);
Para el lunes, el -5 sería cambiar a -2.
Ejemplo de código para imprimir
String s = "";
DateTime date = new DateTime(2017, 1, 1);
for (int i = 0; i < 14; i++)
{
date = date.AddDays(1);
DateTime thu = date.AddDays(-(int)(date.AddDays(-5).DayOfWeek) -1);
DateTime mon = date.AddDays(-(int)(date.AddDays(-2).DayOfWeek) -1);
s += date.ToString() + " - Thu: " + thu.ToString() + " - Mon: " + mon.ToString() + "\r\n";
}
Console.WriteLine(s);
¿Qué pasa con la complicación de cálculo de la semana de trabajo anterior al cierre de la empresa el viernes, que luego debe volver la semana en curso que el viernes estaba en? –