用下面的代码把一个文件中的行按长度排序,这样写功能是没问题,但不知效率上是否可以优化?

ynduanlian 2018-02-04 10:10:04
ArrayList arrPhrase = new ArrayList();
StreamReader sr = new StreamReader(txtInput.Text, Encoding.Default);
String line;
while ((line = sr.ReadLine()) != null)
{
if (line.Trim().Length>1)
arrPhrase.Add(line.Trim());
}
sr.Close();

SortLen sl = new SortLen();
arrPhrase.Sort(sl);


SortLen 类的实现:
public class SortLen : IComparer
{
int IComparer.Compare(object a, object b)
{
return (((string)b).Length - ((string)a).Length);
}
}

不知上面的代码是否有优化改进以提高效率的可能?
...全文
106 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2018-02-05
  • 打赏
  • 举报
回复
感觉并不能怎么优化,因为使用的都是最简单最基础的。 更没有逻辑上的优化余地。
ynduanlian 2018-02-05
  • 打赏
  • 举报
回复
也就是说,跟预想的不一样啊,需要装箱拆箱的ArrayList反而要快那么一点点……
ynduanlian 2018-02-05
  • 打赏
  • 举报
回复
试了下: ArrayList arrPhrase; List<string> L1; StreamReader sr = new StreamReader(txtInput.Text, Encoding.Default); String line; L1=new List<String>(); arrPhrase = new ArrayList(); while ((line = sr.ReadLine()) != null) { if (line.Trim().Length>1) { arrPhrase.Add(line.Trim()); L1.Add(line.Trim()); } } sr.Close(); SortLen sl = new SortLen(); Stopwatch watch = new Stopwatch(); watch.Start(); // arrPhrase.Sort(sl); L1.Sort(SortList); watch.Stop(); Console.WriteLine("用时{0}毫秒", watch.ElapsedMilliseconds); return; private int SortList(string a, string b) { return (b.Length - a.Length); } public class SortLen : IComparer { int IComparer.Compare(object a, object b) { return (((string)b).Length - ((string)a).Length); } } 发现用List<string>和ArrayList排序差别不是很大,对一个大文件读入排离,大概都在143ms左右,和运行7次后的结果累计,用ArrayLit居然比用List<string>还稍快一点,快1%。
ynduanlian 2018-02-05
  • 打赏
  • 举报
回复
反复试验后发现,使用List<String>和ArrayList在按长度排序方面,用泛型反而还慢一点点。但是如果频繁的取写集合中的元素,则泛型又要快一点点。 但总体上说,这种效率上的差别是十分微小的,装箱和拆箱并不象很多贴子说的会产生比较大的额外开销。
xuzuning 2018-02-04
  • 打赏
  • 举报
回复
ArrayList 对 string 也有装箱和拆箱的动作吧? 用 List<string> 应该好些 arrPhrase.Sort(s) 和 arrPhrase.Sort((a, b) => a.Lengh - b.Length) 是一样的 就看编译器喜欢哪种写法了
ynduanlian 2018-02-04
  • 打赏
  • 举报
回复
因为后面会对ArrayList中的String进行改动、删除某些字符串中的某些个子串,并要求反复次对ArrayList按字符串长度重新排序,所以我只能把排序和读入部分分开。 从文本文件读入只发生一次,但排序可能在程序运行中反复进行几千次。所以我主要想请教,对ArrayList按字符串长度排序是否还有优化的办法?
xuzuning 2018-02-04
  • 打赏
  • 举报
回复
我喜欢这样写
var arrPhrase = File.ReadAllLines(txtInput.Text).Select(x => xTrim()).Where(x => x.Length>1).OrderBy(x => x.Length).ToList();

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧