将两个列表一起排序为一个?
我有两个List,我通过索引访问(例如Name[10]
, Date[10]
)。 它们紧密相关,因此Name[10]
与Date[10]
相关,反之亦然。
这种设计运作良好,但现在我需要对它们进行排序。 我可以单独对它们进行排序,但显然会消除两个列表之间的关系并使它们变得毫无价值。
我想过使用Dictionary
但似乎我只能通过Key访问它(这也是不可行的)。 基本上我需要三个东西,两个值和一个索引,我可以通过数字迭代(不是foreach
)。
有人可以帮忙吗? 看来我需要改变数据结构或者解决如何将两个不同的List
排序在一起……
public class Results { public List Name { get; set; } public List Date{ get; set; } } for (int x = 0; x < results; x++) { zN = results.Name[X]; zD = results.Date[x]; }
听起来你正在反对做一个涉及一些前期工作的明显解决方案:创建一个类型来封装名称/日期对。
这绝对是你应该做的。 然后你可以有一个列表,按名称或日期或任何你想要的方式对其进行排序,你永远不必担心这两个列表不同步等。
如果您的Results
类除了包含这两个列表之外没有做任何事情,您实际上最终可以得到相同数量的类型 – 您可以完全抛弃Results
,而支持List
,其中Result
具有名称和日期。
使用带有一组键和一组值的Array.Sort重载,它正是你想要的。 (此方法自.NET 2.0起可用。)
帮自己一个忙,把两件事放在一起:
public class NameAndDate { public string Name { get; set; } public DateTime Date { get; set; } }
然后将它们保存在一个列表中( List
):
如果要按名称排序,请将IComparer
实现添加到NameAndDate
,然后只需在列表中调用Sort()
。
如果要继续访问“名称”和“日期”,请向“结果”添加访问者方法,例如
public string GetName(int index) { return list[i].Name; }
List NameDateList {get; set; }
是一种简单的方法来实现您想要的,但为了清楚起见,您可能最好自定义类型来容纳它们,例如:
public class NameDate { public string Name { get; set; } public DateTime Date{ get; set; } }
然后你可以使用:
List NameDateList {get; set; }
您可以创建一个自定义类型来保存值,或者如果您只需要在单个方法的范围内使用它,则可以使用匿名类型,如下所示。
var namesAndDates = MyNames .Select((name, i) => new {name, date = MyDates[i]});
从这里开始,这两个值不再松散地联系在一起。 现在你可以对它们进行排序
var sortedNamesAndDates = namesAndDates.OrderBy(a => a.date);
或者其他任何你需要做的事情。
使用两个属性创建一个名为“Result”的类
public class Result { public string Name {set;get;} public DateTime Date { set;get;} }
现在您可以创建此类的List
List objListResult=new List ();
现在,在您的情况下,如果您愿意,您可以阅读您的不同列表的内容并将其放入我们的新列表。 (这只是你的情况,如果你真的想将数据从旧列表移动到我们的新列表。如果可能的话,你可以更新你将数据加载到两个List的代码(这是正确的方法),这样它就会将数据加载到我们新的类型结果列表中,并避免此移植代码将数据移动到新列表。
for(int i=0;i
您可以像这样访问新列表中的项目
objListResult[2].Date
将为您提供列表中第二个对象的存储日期
objListResult[2].Name
将为您提供列表中第二个对象的存储名称
您可以使用带有键名的字典,并使用值Date
你可以轻松地将它们分类