将两个列表<t>一起排序为一个?</t>

时间:2011-12-16 23:28:35

标签: c# asp.net

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

这种设计运作良好,但现在我需要对它们进行排序。我可以单独对它们进行排序,但显然会消除两个列表之间的关系并使它们变得毫无价值。

我考虑使用Dictionary<string, DateTime>,但似乎我只能通过Key访问它(这也是不可行的)。基本上我需要三个东西,两个值和一个索引,我可以用数字迭代(不是foreach)。

有人可以帮忙吗?我似乎需要改变数据结构或者解决如何将两个不同的List<T>排在一起......

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]; } 

7 个答案:

答案 0 :(得分:8)

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

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

如果你的Results类除了包含这两个列表之外没有做任何事情,你实际上最终可以得到相同数量的类型 - 你可以完全抛弃Results,而不是List<Result> 1}}其中Result有一个名字和一个日期。

答案 1 :(得分:8)

使用带有一组键和一组值的Array.Sort重载,它正是您想要的。 (此方法自.NET 2.0起已可用。)

答案 2 :(得分:2)

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

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

然后将它们保存在一个列表中(List<NameAndDate>):

如果您想按名称排序,请将IComparer实施添加到NameAndDate,然后您就可以在列表中拨打Sort()

如果要继续访问“名称”和“日期”,请向“结果”添加访问者方法,例如

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

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

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

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

答案 5 :(得分:1)

创建一个名为“Result”的类,其中包含两个属性

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

现在您可以创建此类的列表

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

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

 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

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

答案 6 :(得分:0)

您可以使用带有键名的字典,并使用值

和U之后可以轻松地对它们进行排序