在逗号分隔列表中查找字符串值

时间:2016-04-13 23:37:30

标签: c# linq

我有一个列表(字符串),其成员的格式为'标签,位置&#39 ;;标签是不同的。我需要一个接受label参数并返回位置的方法。

我可以使用foreach迭代查找正确的标签,然后使用Split操作列表成员以返回位置。但是,我确定有更好的方法,大概是使用LINQ,

return theList.Single(x => x == theLabel);

这不起作用,因为列表值== label,location。

3 个答案:

答案 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>();