Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较对象和返回列表_C#_C# 4.0 - Fatal编程技术网

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列表
  • 使用Linq:

      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));