HashSet/List 排序

要求:用户从外部导入TXT文件(input textfile),该文件有三列,分别是storeNum,MosrName,MosrNum,如下是一个input textfile的Case:

5099,Scoresby,5659
5250,Scoresby,5659
5211,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5250,Scoresby,5659
5250,Scoresby,5659
5131,Scoresby,5659
5099,Scoresby,5659
5130,Scoresby,5659
5131,Scoresby,5659
5211,Scoresby,5659
5250,Scoresby,5659

为了程序后续处理该文件,需要验证如下两点:
1)input textfile中可以出现空行,如有空行要忽略它。

2)向用户报告哪些行的storeNum是重复的,报告的格式如下:

Line #1,5,10, has replicated storeNum value : x.

Line #2,3, has replicated storeNum value : y.

第一个问题的简单的处理思路是:读取到一行后过滤空白符,再判断改行的长度是否为零。

第二个问题的有两个思路:

方法1:将各行读到HashSet中,由于HashSet是集合其本身不会被排序,所以可将HashSet排序(HashSet.OrderBy(Comparer))的副本保存到List中再做后序处理。

方法2:由于HashSet本身不会被排序(但是副本可以被排序),所以直接考虑用List。

这两个方法都会将原始的Input textfile中的行被排序,最后提示错误信息将和原始Input textfile不一致,解决这个问题的一个处理办法是:

将原始的Input textfile加上行号,这样即使被排序后,仍然可以知道这行在原始的Input textfile是第几行。

完整的实现如下:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.IO;
  6 
  7 namespace ValidReplicatedLineVer3
  8 {
  9     class Program
 10     {
 11         static void Main(string[] args)
 12         {
 13             string filePath = @"E:inputfile.txt";
 14             StreamReader sr = new StreamReader(filePath);
 15 
 16             List<Line> list = new List<Line>();
 17             int num = 1;
 18 
 19 
 20             while (!sr.EndOfStream)
 21             {
 22                 string strTemp =  sr.ReadLine();
 23                 if (strTemp.Trim().Length == 0)
 24                 {
 25                     continue;
 26                 }
 27 
 28                 string[] strArr = strTemp.Split(new char[] { ',' });
 29                 Line line = new Line();
 30                 line.lineNum = num++;
 31                 line.storeNum = strArr[0];
 32                 line.mosrName = strArr[1];
 33                 line.mosrNum = strArr[2];
 34 
 35                 list.Add(line);
 36             }
 37             sr.Close();
 38 
 39             list = list.OrderBy(x => x.storeNum).ToList();
 40 
 41             foreach (Line l in list)
 42             {
 43                 StringBuilder sb1 = new StringBuilder();
 44                 sb1.AppendLine(Convert.ToString(l.lineNum) + ',' + l.storeNum + ',' + l.mosrName + ',' + l.mosrNum);
 45                 Console.Write(sb1);
 46             }
 47 
 48             StringBuilder sb = new StringBuilder();
 49             sb = ValidReplicatedLines(list);
 50             Console.WriteLine(sb);
 51           
 52         }
 53 
 54         static StringBuilder ValidReplicatedLines(List<Line> list )
 55         {
 56             bool isFirst = true;
 57             string storeNum = null;
 58             StringBuilder sb = new StringBuilder();
 59             StringBuilder sbRet = new StringBuilder();
 60             for (int i = 0; i < list.Count - 1; i++)
 61             {
 62                 if ((list[i].storeNum == list[i + 1].storeNum) && ((i + 1) != list.Count))
 63                 {
 64                     if (isFirst)
 65                     {
 66                         sb.Append("Line #" + Convert.ToString(list[i].lineNum) + "," + Convert.ToString(list[i + 1].lineNum) + ",");
 67                         isFirst = false;
 68                         storeNum = list[i].storeNum;
 69                     }
 70                     else
 71                     {
 72                         sb.Append(Convert.ToString(list[i + 1].lineNum) + ',');
 73                     }
 74                 }
 75                 else
 76                 {
 77                     if (sb.ToString().Trim().Length != 0)
 78                     {
 79                         sb.Append(" replicated value: " + storeNum);
 80                         isFirst = true;
 81                         sbRet.AppendLine(sb.ToString());
 82                         sb.Remove(0, sb.Length);
 83                     }
 84                 }
 85             }
 86             if (sb.ToString().Trim().Length != 0)
 87             {
 88                 sb.Append("replicated value: " + storeNum);
 89                 sbRet.AppendLine(sb.ToString());
 90             }
 91 
 92             return sbRet;
 93         }
 94 
 95         public class Line
 96         {
 97             public int lineNum;
 98             public string storeNum;
 99             public string mosrName;
100             public string mosrNum;
101         }
102     }
103 }
View Code
原文地址:https://www.cnblogs.com/freecodeX/p/3825801.html