2017-09-07 24 views
-1

私は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 ]; 
} 

私の質問は、これにアプローチするより良い/簡単な方法はありますか?

+1

私はお手伝いしたいと思いますが、あなたのコードの書式設定が私の目を傷つけ、今や私は目が見えません。 – itsme86

+2

誰かが私を解決するのを手伝った。今あなたの失明を修正する必要があります:) @ itsme86 – Meidi

+0

私はあなたの現在のデザインは、メソッドが呼び出されるたびにコンマ区切りリストを再解析する必要があることを指摘したいと思います。一度それを解析し、 'IEnumerable 'や 'IList 'を渡すことは、もっと大いに効果があります。 – itsme86

答えて

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; 
+0

を返します。または、 'var index = names.Where(n => n.name == userName).Select(x =>(int?)x.index)を使用できます。 FirstOrDefault()?? -1; var result =名前[インデックス+ 1]。名前: ' – Xiaoy312

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(); 
} 
-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]; 
    } 
} 
+2

見つかったユーザ名がリストの最後のものであれば... – maccettura

+1

あなたのソリューションは私のものよりも短く、ありがとう。しかし、あなたの答えを編集して 'IndexOutOfRange'例外を取り除いてください –

+0

十分に固定されています。 –

1

あなたは、文字列のリストがトリミングされていることを確認するために余分なステップを取る場合は、あなただけのList<T>IndexOf()方法を使用することができます。

string csv = "test1, test2, test3, test4";  
List<string> names = csv.Split(',').Select(x => x.Trim()).ToList(); 

次に、あなたのNextInString()方法(私はこれが悪いと命名されたと思います)メソッドは、次のようになります。私はフィドルを作っ

private static string NextInString(List<string> names, string userName) 
{  
    int index = names.IndexOf(userName); 

    if(names.Count - 1 == index || index == -1) 
    { 
     return "No result"; 
    } 
    else 
    { 
     return names[index + 1]; 
    } 
} 

here

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

それが返されます:

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

あなたはこのようにそれを使用することができます:あなたは、文字列の後にこれを行うためのちょっといい拡張メソッドを作ることができます

+1

技術的には、 'IndexOf'はLINQの一部ではありません。これは、 '' List '](https://msdn.microsoft.com/en-us/library/e4w08k17(v=vs.110).aspx)の直接のメンバーであり、' Systemに定義された拡張メソッドではありません。 Linq'。 –

+0

@BradleyUffnerあなたは絶対に正しいです、私は脳のおならを持っていました – maccettura

+0

より良い名前のための任意の提案? – Meidi

0
は、スプリット、とても似ています


ラット


このオーバーロードにより、要求されたアイテムが見つからない場合、または次のアイテムがリストの外にある場合に返されるデフォルト値を指定できます。

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]; 
} 
+0

入力として「ラット」を入力するとどうなりますか?入力として「鳥」を置くとどうなりますか? – maccettura

+0

リストにないアイテム(bird)の場合、リストの最初のアイテムを返します。リスト(ラット)の最後の項目については、 'ArgumentOutOfRangeException'をスローします。その動作は、必要に応じて簡単にカスタマイズできます。 –

関連する問題