Linq - использование не «IN» оператора для выбора не дублированных строк из текстового файла - PullRequest
2 голосов
/ 15 марта 2010

Я использую Linq для выбора и обработки строк из текстового файла. Мой txtfile состоит из двух столбцов, разделенных символом «|». Файл содержит следующее:

HAbbe | 11
GABBOT | 22 * ​​1004 * DABDA | 33
RAchant | 44
РАДА | 55
DABDA | 66

Вы заметите, что строки 3 и 6 имеют дублированный идентификатор (столбец 1). Я хочу использовать linq, чтобы сначала прочитать опубликованный текстовый файл, найти дубликат (и сообщить об этом), а затем я бы хотел выбрать из запроса ling только те строки, которые не дублируются. Вот что у меня есть:

 StreamReader srReader = new StreamReader(fUpload.PostedFile.InputStream);

                var query1 =
                       from line in srReader.Lines()
                       let items = line.Split('|')
                       select new UploadVars()
                       {
                           ID = items[0],
                           Number = items[1]
                       };
                var GroupedQuery = from line in query1
                                   group line by line.ID into grouped
                                   where grouped.Count() > 1
                                   select new {
                                       ID = grouped.Key,
                                       MCount = grouped.Count()
                                   };

                StringBuilder sb = new StringBuilder();
                foreach (var item in GroupedQuery)
                {

                    sb.AppendFormat("The following external ID's occur more than once and have not been processed:<br> {0}. Duplicated {1} times.", item.ID, item.MCount);
                }

Это все нормально и дает мне правильные результаты. Я сейчас ищу, чтобы выбрать все строки, кроме 2 дублированных строк из текстового файла. Я написал следующее утверждение linq, но по какой-то причине мне не повезло:

//lets start at the beginnnig of the the posted filestream 
                fUpload.PostedFile.InputStream.Position = 0;
                srReader = new StreamReader(fUpload.PostedFile.InputStream);
                var query2 = from line in srReader.Lines()
                             let items = line.Split('|')
                             select new UploadVars()
                             {
                                 ID = items[0],
                                 Number = items[1]
                             };                                   

                var qryNoDupedMems = from Memb in query2
                                      where !(from duped in GroupedQuery
                                              select duped.ID)
                                              .Contains(Memb.ID)
                                      select Memb; 

Результатом qryNoDupedMems является полный список из текстового файла. Может ли кто-нибудь объяснить, что я делаю не так здесь ... Заранее спасибо

1 Ответ

2 голосов
/ 15 марта 2010

В запросе group переменная grouped также является IEnumerable, содержащим темы в группе.

Следовательно, вы можете написать следующее:

var nonDuplicates = from line in query1
    group line by line.ID into grouped
    where grouped.Count() == 1
    select grouped.First()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...