使用数值对类字符串字段属性进行排序

时间:2015-01-14 06:25:51

标签: c# asp.net sorting

我有一个类,其中一个属性“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秒,依此类推。

然后将其写入文件流。

任何人都可以帮助我。 提前致谢。

3 个答案:

答案 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