我有一个类,其中一个属性“Name”包含"1_[AnnualRevenue]","2_[ResellerType]","3_xxx"....
我的课就像
class xxx
{
private string fileName;
public string FileName
{
get { return fileName; }
set { fileName = value; }
}
}
我正在将值分配给类的对象。比如xxx.FileName="1_[AnnualRevenue]";
现在我有一个列表类。现在根据这个类属性对列表进行排序。
现在我想根据数字顺序对字段进行排序,我的意思是1前2秒,依此类推。
然后将其写入文件流。
任何人都可以帮助我。 提前致谢。
答案 0 :(得分:2)
您可以使用LINQ为您执行此操作
List<xxx> orderedList = unOrderedList.OrderBy(o => Convert.ToInt32(o.FileName.Split('_').First())).ToList();
代表评论编辑答案 - 指出我们确实需要转换为整数才能正确排序。
答案 1 :(得分:2)
您可以执行以下操作对列表进行排序:
List<xxx> list = new List<xxx>
{
new xxx { FileName = "3_a" },
new xxx { FileName = "1_a" },
new xxx { FileName = "2_a" },
new xxx { FileName = "8_a" }
};
var sorted = list.OrderBy(it => Convert.ToInt32(it.FileName.Split('_')[0]));//using System.Linq;
您可以将列表写入磁盘文件,如下所示:
using (TextWriter tw = new StreamWriter("C:\\FileNames.txt"))
{
foreach (var item in sorted)
{
tw.WriteLine(item.FileName.ToString());
}
}
答案 2 :(得分:2)
由于该属性为String
,但您希望以数字方式对其进行排序,最好的方法是在您的类上实现IComparable
,然后将自定义排序代码放在{{1}中} 方法。然后,每次要对列表进行排序时,都不必编写更复杂的Lambda语句,只需在列表中调用CompareTo
方法即可。
您还可以处理Sort()
属性不包含下划线或FileName
的情况,而不是在null
代码中获取异常(大多数情况都会发生这种情况)其他答案)。
我还进行了其他一些更改 - 覆盖OrderBy
方法,以便您可以轻松地将值显示到控制台窗口,并使用ToString
属性的自动属性语法,以便我们可以删除支持领域:
FileName
现在,您只需在列表中拨打class xxx : IComparable<xxx>
{
public string FileName { get; set; }
public int CompareTo(xxx other)
{
// Short circuit if any object is null, if the
// Filenames equal each other, or they're empty
if (other == null) return 1;
if (FileName == null) return (other.FileName == null) ? 0 : -1;
if (other.FileName == null) return 1;
if (FileName.Equals(other.FileName)) return 0;
if (string.IsNullOrWhiteSpace(FileName))
return (string.IsNullOrWhiteSpace(other.FileName)) ? 0 : -1;
if (string.IsNullOrWhiteSpace(other.FileName)) return 1;
// Next, try to get the numeric portion of the string to compare
int thisIndex;
int otherIndex;
var thisSuccess = int.TryParse(FileName.Split('_')[0], out thisIndex);
var otherSuccess = int.TryParse(other.FileName.Split('_')[0], out otherIndex);
// If we couldn't get the numeric portion of the string, use int.MaxValue
if (!thisSuccess)
{
// If neither has a numeric portion, just use default string comparison
if (!otherSuccess) return FileName.CompareTo(other.FileName);
thisIndex = int.MaxValue;
}
if (!otherSuccess) otherIndex = int.MaxValue;
// Return the comparison of the numeric portion of the two filenames
return thisIndex.CompareTo(otherIndex);
}
public override string ToString()
{
return FileName;
}
}
:
Sort