我有一个列表(字符串),其成员的格式为'标签,位置&#39 ;;标签是不同的。我需要一个接受label参数并返回位置的方法。
我可以使用foreach迭代查找正确的标签,然后使用Split操作列表成员以返回位置。但是,我确定有更好的方法,大概是使用LINQ,
return theList.Single(x => x == theLabel);
这不起作用,因为列表值== label,location。
答案 0 :(得分:1)
请参阅以下代码:
string get_location(List<string> list, label)
{
return list.Select(s => s.Split(',')).ToDictionary(s => s[0], s => s[1])[label];
}
如果同一列表中有多个请求,那么最好保存该字典,然后重新使用所有查询的标签:
var map = list.Select(s => s.Split(',')).ToDictionary(s => s[0], s => s[1]);
可替换地:
var map = new Dictionary<string, string>();
list.ForEach(s => { var split = s.Split(','); map.Add(split[0], split[1]); });
答案 1 :(得分:1)
由于标签是唯一的,因此您可以考虑将数据转换为dictionary<string,string>
。您可以将标签保留为键,将位置保留为值。
var lableLocatonDict = theList.Select(item => item.Split(','))
.ToDictionary(arr => arr[0], arr => arr[1]);
现在,要访问特定标签(键)的位置(值),您只需执行此操作
var location = lableLocatonDict["LabelToCheck"];
如果要在访问项目之前检查项目是否存在,可以使用ContainsKey方法。
if(lableLocatonDict.ContainsKey("LabelToCheck"))
{
var location = lableLocatonDict["LabelToCheck"];
}
或TryGetValue
var location = string.Empty;
if(lableLocatonDict.TryGetValue("LabelToCheck",out location))
{
// location will have the value here
}
答案 2 :(得分:1)
正如我和其他2个答案所推荐的那样,Dictionary就是为了这个目的而设计的。你表示担心迭代dict而不是列表认为它可能更难,但事实上它更容易,因为不需要分裂(并且更快)。
Dictionary<String,String> locations = new Dictionary<String,String>();
//How to add locations
locations.Add("Sample Label","Sample Location");
//How to modify a location
locations["Sample Label"] = "Edited Sample Locations";
//Iterate locations
foreach (var location in locations)
{
Console.WriteLine(location.key);
Console.WriteLine(location.value);
}
我甚至会更进一步说出你的应用程序的未来证明,并添加能够存储在每个位置的更多信息,你应该真正使用ObservableCollection<T>
T
是一个自定义class object:
public class LocationInfo
{
String Label {get;set;}
String Location {get;set;}
String Description {get;set;}
}
ObservableCollection<LocationInfo> Locations = new ObservableCollection<LocationInfo>();