Turing85 дал вам хороший совет. Я бы посоветовал вам следовать этому, чтобы понять, что пошло не так в вашем коде.
Но чтобы помочь вам в этой конкретной ситуации, вопрос, почему ваш код не работает ни для каких других классов, заключается в том, как вы структурировали свои if
условия.
Рассмотрим приведенный ниже фрагмент из вашего кода:
if( score <= 100 )
{
if( score >= 90 )
grade = "A";
}
else if( score <= 89 )
{
if( score >= 80 )
grade = "B";
return grade;
}
Если score
равно >=90
, grade
устанавливается как A
. Но если score
- это не >=90
, а <=100
, то он не пойдет в блок else if
, где вы установите его на B
, поскольку он будет напрямую выходить из else if
лестницы из [ 1113] состояние.
Таким образом, вы должны изменить метод, как показано ниже:
public static String scoreToGrade( int score )
{
String grade = "";
if( score <= 100 && score >= 90 )
{
grade = "A";
}
else if( score <= 89 && score >= 80)
{
grade = "B";
}
else if( score <= 79 && score >= 70)
{
grade = "C";
}
else if( score <= 69 && score >= 60)
{
grade = "D";
}
else if( score <= 59 && score >= 50)
{
grade = "E";
}
else if( score <= 49 && score >= 0)
{
grade = "F";
}
else
{
grade = "Error: score " + score;
}
return grade;
}
Форматирование CSV имеет некоторые глюки. Задайте Вы сами эти вопросы:
я вижу несколько проблем в Вашем коде выше. Вещь запятой, в первую очередь... Вы разделяете запятые:
CsvLine.Append(Format(b.Price, "c").Replace(",", ""))
, Почему? В CSV необходимо окружать что-либо, что имеет запятые с кавычками:
CsvLine.Append(String.Format("\"{0:c}\"", b.Price))
(или что-то как этот... мой VB не очень хорош). Если Вы не уверены, существуют ли запятые, но помещенные кавычки вокруг этого. Если существуют кавычки в строке, необходимо выйти из них путем удвоения их. "
становится ""
.
b.Title.Replace("\"", "\"\"")
Затем окружают это кавычками, если Вы хотите. Если существуют новые строки в Вашей строке, необходимо окружить строку кавычками... да, литеральные новые строки позволены в файлах CSV. Это выглядит странным людям, но это - вся польза.
А хорошее устройство записи CSV требует некоторой мысли. Хороший читатель CSV (синтаксический анализатор) просто тверд (и не, regex не достаточно хороший для парсинга CSV... это только получит Вас приблизительно 95% пути там).
И затем существует Unicode... или в более общем плане I18N (Интернационализация) проблемы. Например, Вы разделяете запятые из отформатированной цены. Но это предполагает, что цена отформатирована, поскольку Вы ожидаете это в США. Во Франции форматирование чисел инвертируется (периоды, используемые вместо запятых, и наоборот ). Нижняя строка, используйте агностика культуры, форматирующего по мере возможности.
, В то время как проблема здесь генерация CSV, неизбежно необходимо будет проанализировать CSV. В.NET лучший синтаксический анализатор, который я нашел (бесплатно), Быстрый Читатель CSV на CodeProject. Я на самом деле использовал его в производственном коде, и это действительно действительно быстро, и очень просто в использовании!
Я передаю все свои данные CSV через функцию как это:
Function PrepForCSV(ByVal value As String) As String
return String.Format("""{0}""", Value.Replace("""", """"""))
End Function
кроме того, если Вы не подаете HTML, Вы, вероятно, хотите http обработчик (.as файл h x), а не полная веб-страница. При создании нового обработчика в Visual Studio разногласия - Вы, мог бы просто скопировать мимо Вашего существующего кода в основной метод, и это будет просто работать с маленьким повышением производительности для Ваших усилий.
Если Вы хотите разграниченный преобразователь значения двоеточия затем существует сторонний открытый исходный код, названный FileHelpers. Я не уверен, о какой лицензии с открытым исходным кодом это находится под, но она помогла мне довольно много.
Можно создать эквивалент bookString () в самом запросе. Вот то, что я думаю, был бы более простой путь.
protected void Page_Load(object sender, EventArgs e)
{
using (var db = new bookDevelopmentDataContext())
{
string fileName = "book.csv";
var q = from b in db.books
select string.Format("{0:d},\"{1}\",\"{2}\",{3:F2}", b.Published, b.Title.Replace("\"", "\"\""), b.Author.Replace("\"", "\"\""), t.price);
string outstring = string.Join(",", q.ToArray());
Response.Clear();
Response.ClearHeaders();
Response.ContentType = "text/csv";
Response.AppendHeader("Content-Disposition", string.Format("attachment;filename={0}", fileName));
Response.Write("Published,Title,Author,Price," + outstring);
Response.End();
}
}
Существует много издержек, связанных с классом Page. Так как Вы просто выкладываете файл CSV и не имеете никакой потребности в обратной передаче, управлении сервером, кэшировании или остальной части его, необходимо превратить это в обработчик с .ashx расширением. Посмотрите здесь .
В дополнение к тому, что сказал Simon, можно хотеть читать руководство практического руководства CSV и удостовериться, что вывод не натыкается ни на один из глюков.
Для разъяснения чего-то Simon сказал:
Затем окружают это кавычками, если Вы захотите
Поля, которые содержат согнутые двойные кавычки (""), то должен будет быть полностью окружен двойными кавычками. Не должно быть никакого вреда в просто обертывании всех полей с двойными кавычками, если Вы конкретно не хотите, чтобы синтаксический анализатор разделил ведущий и запаздывающий пробел (вместо того, чтобы обрезать его сами).