C# 比较对象和返回列表
我有一个类定义,如下所示:C# 比较对象和返回列表,c#,c#-4.0,C#,C# 4.0,我有一个类定义,如下所示: public class MyObjectModel { public int ObjectID { get; set; } //for when the user's data is split in 2 fields public string FirstName { get; set; } public string LastName { get; set; } //for when the user's data is all
public class MyObjectModel
{
public int ObjectID { get; set; }
//for when the user's data is split in 2 fields
public string FirstName { get; set; }
public string LastName { get; set; }
//for when the user's data is all in one field
public string FirstLastName { get; set; }
}
我有这些MyObjectModel
的列表,我想通过自定义排序过程按名称对它们进行排序,因为这涉及到检查数据是否包含LastName
(在本例中,使用LastName
进行排序)或只包含FirstLastName
(在本例中,我将打断字符串并对第二项进行排序,如果有,或者如果只有一个单词,则仅对整个字符串进行排序。)
有两件事我不确定:
IComparer
还是IComparable
ObjectID
的int列表 List<MyObjectModel> objects = new List<MyObjectModel>();
List<int> ids = objects.OrderBy(o => FunctionWhichReturnsNameForSort(o)).Select(o => o.ObjectID).ToList();
如果此排序特定于一个用例,则可以使用LINQ实现:
var sortedIds = models.OrderBy(SecondName).Select(m => m.ObjectId).ToList();
private static string SecondName(MyObjectModel model)
{
if (!string.IsNullOrWhitespace(model.LastName)) return model.LastName;
return model.FirstLastName.Split(' ').Last();
}
当你真的需要这个奇怪的双重解决方案时,你会经常遇到类似的问题。作为一个更一般的解决方案,考虑把业务逻辑的名字放在几个只读属性中:
//for when the user's data is split in 2 fields
public string FirstName { get; set; }
public string LastName { get; set; }
//for when the user's data is all in one field
public string FirstLastName { get; set; }
public string FullName
{
get { ... } // pick from LastName, FirstName, FirstLastName
}
public string SortName
{
get { ... } // pick from LastName, FirstLastName
}
一旦它确定了排序的顺序(我可以这样做),我如何使它成为方法的输出是一个表示ObjectID的int列表
正如其他人所建议的,虽然您可以使用LINQ,但这需要创建一个全新的列表,而不是对现有列表进行修改。这可能更可取,也可能不可取。如果您想对列表本身进行排序,这也很简单:
List<string> list = new List<string>(){"a","b","c"};
list.Sort((a,b)=> a.CompareTo(b));
List List=newlist(){“a”、“b”、“c”};
排序((a,b)=>a.CompareTo(b));
只需获取列表,调用
Sort
,并传入一个lambda,该lambda包含两个项目并返回一个整数,指示哪个更大。在您的情况下,只需调用a
和b
上的某个方法来获取字符串,然后使用CompareTo
或字符串。根据版本对这两个字符串进行比较。
。对于您使用的C#,您可以使用Linq对其进行排序。为了精度,我使用C#4。一些姓氏有多个部分(空格)。如果名称字符串有多个部分,我将在第二个字符串上进行比较。该函数whichreturnsnameforsort函数应该返回什么?它应该基于比较逻辑返回-1,0,1吗?它应该返回用于排序的名称。我将添加一个示例。好的,谢谢;我将把它与Holterman的答案结合起来!快速跟进w-up:如果NameSort函数返回一个空字符串,这将如何排序?试试:)我相信它在内部使用Comparer.Default来比较对象。我喜欢这样的想法:与其对对象的属性进行比较,不如对返回我正在排序的字符串的函数的输出进行比较。这就是你的意思吗?是的。对特殊属性进行排序,将其背后的逻辑保留在类中。快速跟进:如果对于列表中的某些对象,SortName方法最终返回空字符串,那么比较将如何进行?
result = MyObjectList
.OrderBy(m => m.SortName) // sort on SortName
.Select(m => m.ObjectID) // select the Id
.ToList();
List<string> list = new List<string>(){"a","b","c"};
list.Sort((a,b)=> a.CompareTo(b));