在字符串列表中查找下一个字符串

时间:2017-09-07 17:10:49

标签: c#

我在逗号分隔的字符串中有一个UserNames列表。我想找到下一个输入用户名。 例如:

var s0 = "abc,deF,ghi,jkl";
var s1 = "abc";
var s2 = "def";
var s3 = "ghi";
var s4 = "jkl";

结果应该是:

NextInString(s0,s1 ) == "def"
NextInString(s0,s2 ) == "ghi"
NextInString(s0,s3 ) == "jkl"
NextInString(s0,s4 ) == "jkl"

这就是我所拥有的:

string NextInString(string listOfNames, string userName)
{
    if(listOfNames == string.Empty || userName == string.Empty) 
        return string.Empty;

    var s = listOfNames.Split(',');
    var count = 0;
    foreach (var element in s)
    {
        if (element == userName)break;
        count++;
    }

    if (s.Length -1 == count)
    {
        return s[count];
    }
    else return s[ count + 1 ];
}

我的问题是,是否有更好/更简单的方法来解决这个问题?

5 个答案:

答案 0 :(得分:1)

如果您采取额外步骤以确保修剪字符串列表,则可以使用IndexOf()的{​​{1}}方法:

List<T>

然后你的string csv = "test1, test2, test3, test4"; List<string> names = csv.Split(',').Select(x => x.Trim()).ToList(); 方法(我认为这是一个命名不佳的方法)看起来像这样:

NextInString()

我做了一个小提琴here

答案 1 :(得分:0)

您可以像这样使用Linq:

string userName = "abc";
string listOfNames = "abc,xyz,123";

var names = listOfNames
    .Split(',')
    .Select((n, i) => new {name = n, index =i} )
    .ToArray();

var firstMatch = names.FirstOrDefault(n => n.name == userName);
var result = firstMatch == null
    ? string.Empty
    : firstMatch.index == names.Length - 1
        ? string.Empty
        : names[firstMatch.index + 1].name;

答案 2 :(得分:0)

以下是LINQ方法:

string NextInString(string listOfNames, string userName)
{
    if(listOfNames == string.Empty || userName == string.Empty) return string.Empty;

    var names = listOfNames.Split(',');
    return names
        .SkipWhile(x => x != userName)
        .Skip(1)
        .FirstOrDefault() ?? names.Last();
}

答案 3 :(得分:0)

你可以在分割字符串之后做一个很好的小扩展方法,如下所示:

static class IListExtensions
{
    public static T FindItemAfter<T>(this IList<T> list, T targetItem)
    {
        return list[list.IndexOf(targetItem)+ 1];
    }
}

你可以像这样使用它:

static void Main(string[] args)
{
    var list = "cat,dog,rat".Split(',');
    Console.WriteLine(list.FindItemAfter("cat"));
    Console.WriteLine(list.FindItemAfter("dog"));
    Console.ReadLine();
}

它返回:

  


  鼠

此重载将允许您指定在找不到请求的项目时返回的默认值,或者下一个项目将在列表之外。

public static T FindItemAfter<T>(this IList<T> list, T targetItem, T defaultValue)
{
    var index = list.IndexOf(targetItem);
    if (index == -1 || index >= list.Count - 1)
    {
        return defaultValue;
    }
    return list[index + 1];
}

答案 4 :(得分:-1)

这样的事情怎么样?

var s = listOfNames.Split(',');
for (var i = 0; i < s.count; i++)
{
    if (i == s.count - 1)
    {
        return string.Format("No user after {0} was found", userName);
    }
    else if (s[i] == userName)
    {
        return s[i + 1];
    }
}