【问题标题】:Sort two Lists<T> together as one?将两个 Lists<T> 排序为一个?
【发布时间】:2011-12-16 23:28:34
【问题描述】:

我有两个按索引访问的列表(例如Name[10]Date[10])。它们紧密相连,所以Name[10]Date[10] 相关,反之亦然。

这个设计效果很好,但现在我需要对它们进行排序。我可以分别对它们进行排序,但显然这会消除两个列表之间的关系并使它们变得毫无价值。

我考虑过使用Dictionary&lt;string, DateTime&gt;,但似乎我只能通过密钥访问它(这也是不可行的)。本质上,我需要三个东西,两个值和一个索引,我可以用数字方式迭代它们(不是foreach)。

有人可以帮忙吗?看来我要么需要更改数据结构,要么想办法将两个不同的List&lt;T&gt; 排序在一起......

public class Results
{ 
public List<string> Name { get; set; }
public List<DateTime> Date{ get; set; }
}

for (int x = 0; x < results; x++)
{ z.N = results.Name[X]; z.D = results.Date[x]; } 

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    使用带有键数组和值数组的Array.Sort 重载,它完全符合您的要求。 (此方法从 .NET 2.0 开始可用。)

    【讨论】:

    • 感谢您按原样回答问题。像其他答案所暗示的那样将名称和日期配对在一起通常是很好的建议,但在某些情况下存储两个对称数组是有意义的。具体来说,在计算密集型算法中使用“数组结构”数据布局。
    • 完美。正是我想要的。我不知道有这个功能。
    【解决方案2】:

    听起来您正在反对采取涉及一点前期工作的明显解决方案:创建一个类型来封装名称/日期对。

    那是绝对你应该做的。然后你可以有一个列表,按名称或日期或任何你想要的排序,你永远不必担心两个列表不同步等。

    如果您的 Results 类除了包含这两个列表之外没有做任何事情,那么您实际上可以得到相同数量的类型 - 您可以完全放弃 Results,转而使用 List&lt;Result&gt; 其中 @987654324 @ 有名称和日期。

    【讨论】:

    • 他可以使用通用字典
    • @AMH:OP 已经考虑到这一点——它不会保持秩序,而且它基本上不是他想要存储的东西。他想要一个列表,但有两个不同的值。
    • 另外一个好处是,此解决方案将允许您为要表示的任何概念指定一个明确的名称,此外,您可以在同一类型中嵌入用于操作此数据的逻辑,而不是而不是将其散布在您的代码中的其他地方。
    【解决方案3】:

    帮自己一个忙,把这两件事放在一起:

    public class NameAndDate {
      public string Name { get; set; }
      public DateTime Date { get; set; }
    }
    

    然后将它们保存在一个列表中 (List&lt;NameAndDate&gt;):

    如果要按名称排序,请在NameAndDate 中添加IComparer 实现,然后在列表中调用Sort() 即可。

    如果您想继续访问名称和日期,请将访问器方法添加到结果中,例如

    public string GetName(int index) {
      return list[i].Name;
    }
    

    【讨论】:

      【解决方案4】:
      List<Tuple<string,DateTime> NameDateList {get; set; }
      

      这是实现您想要的简单方法,但为了清楚起见,您最好制作一个自定义类型来容纳它们,例如:

      public class NameDate
      {
          public string Name { get; set; }
          public DateTime Date{ get; set; }
      }
      

      那么你可以使用:

      List<NameDate> NameDateList {get; set; }
      

      【讨论】:

        【解决方案5】:

        您可以创建一个自定义类型来保存一个值,或者如果您只需要在单个方法的范围内使用它,您可以使用匿名类型,如下所示。

        var namesAndDates = MyNames
            .Select((name, i) => new {name, date = MyDates[i]});
        

        从这里开始,这两个值不再松散地联系在一起。现在您可以对它们进行排序了。

        var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date);
        

        或者你需要对它们做的任何其他事情。

        【讨论】:

          【解决方案6】:

          创建一个具有两个属性的名为“Result”的类

          public class Result
          {
            public string Name {set;get;}
            public DateTime Date { set;get;}
          }
          

          现在你可以创建这个类的列表

          List<Result> objListResult=new List<Result>();
          

          现在,在您的情况下,如果您愿意,您可以阅读您个人列表的内容并将其放入我们的新列表中。 (这仅适用于您的情况,如果您真的想将数据从旧列表移动到我们的新列表。如果可能的话,您可以更新将数据加载到两个列表的代码(这是正确的方法),以便它将将数据加载到我们新的类型结果列表中,并避免使用此移植代码将数据移动到新列表中。

           for(int i=0;i<Name.Count;i++)
           {
             objListResult.Add(new Result { Name =Name[i].ToString(), Date[i].ToString() });
           }
          

          您可以像这样访问新列表中的项目

           objListResult[2].Date   
          

          将为您提供列表中第二个对象的存储日期

           objListResult[2].Name
          

          将为您提供列表中第二个对象的存储名称

          【讨论】:

            【解决方案7】:

            您可以使用带有键名和值日期的字典

            然后你可以轻松地对它们进行排序

            【讨论】:

              猜你喜欢
              • 2015-10-28
              • 1970-01-01
              • 2023-01-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-04-19
              • 2011-08-22
              • 1970-01-01
              相关资源
              最近更新 更多