我有两个我通过索引访问的列表(例如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]; }
答案 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之后可以轻松地对它们进行排序