Заказ StreamWriter с использованием Foreach - PullRequest
1 голос
/ 03 сентября 2011

У меня есть текст, который содержит множество значений, например:

PartNumber    Description    Amount
Fid1          blahblahblah   999934109
0603          moreblah       12
exclude       ehh?           981
FID5          fillertext     123
fid2          fillertext     123
fid           fillertext     123
0603          fillertext     123
0603          fillertext     123
0603          fillertext     123
0402          fillertext     123
0402          fillertext     123
//etc.........etc............etc

Я хотел бы распечатать значения, которые содержат "FID"

int j = 1;
foreach (var line in theList)
{
    if (line.PartNumber.ToUppeR().Contains("FID"))
    {
        sw.WriteLine("{0}: {1} {2} {3}", 
                       j,
                       line.PartNumber,
                       line.Amount,
                       line.Description);
        j++;
    }
}

Однако, когда я делаю это, он распечатывает их следующим образом:

1: Fid1 999934109 blahblahblah
2: FID5 123 fillertext
3: fid2 123 fillertext
4: fid 123 fillertext

, и я хотел бы распечатать их численно .. вот так:

1: fid 123 fillertext
2: Fid1 999934109 blahblahblah
3: fid2 123 fillertext
4: FID5 123 fillertext

Есть липростой и быстрый способ сделать это?

Ответы [ 3 ]

2 голосов
/ 03 сентября 2011

Возможно, вы могли бы использовать предложение orderby запроса LINQ к списку theList:

int garbage;
from line in theList
where line.PartNumber.ToUpper().StartsWith("FID")
orderby (Int32.TryParse(line.PartNumber.Substring(3),garbage)) ? (Int32.Parse(line.PartNumber.Substring(3))) : 0
select line;

Тогда вам не понадобится оператор if в foreach.

1 голос
/ 03 сентября 2011

Исправлен ответ Джима, чтобы он работал: см. Также http://ideone.com/LIawL

using System;
using System.Collections.Generic;
using System.Linq;

namespace TestThat
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            var theList = new [] {
                new { PartNumber="FID34" }
            };

            var result = theList
                .Where (line => line.PartNumber.StartsWith("FID", StringComparison.CurrentCultureIgnoreCase)
                .OrderBy (line =>
                {   
                    int pnumber;
                    return Int32.TryParse(line.PartNumber.Substring(3), out pnumber)
                         ? pnumber 
                         : 0;
                });

        }
    }
}
0 голосов
/ 03 сентября 2011

Строки могут быть сохранены в отсортированном списке. Ключом может быть число, для несуществующих чисел вы можете использовать ноль, или ключом может быть весь «FID».

Я не уверен, что FID повторится, что сделает этот подход невозможным. Кроме того, если размер файла велик, это также невозможно выполнить.

http://msdn.microsoft.com/en-us/library/system.collections.sortedlist.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...