2

String.Split()を実行して、文字列の3つのリストを作成します。その後、それらのリストで交差を実行すると、結果は私が期待するものではありません。コード1(機能しない)

    string a = "AID, BID";
    string b = "[vs|AID|1365]";
    string c = "[vs|BID|1365]";

    List<string> la = new List<string>();
    string[] k = a.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    foreach (string p in k)
    {
        la.Add(p);
    }
    //la.AddRange(k.ToList());
    List<string> lb = new List<string>();
    string[] kk = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    foreach (string p in kk)
    {
        lb.Add(p);
    }
    //lb.AddRange(kk.ToList());
    List<string> lc = new List<string>();
    string[] kkk = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
    foreach (string p in kkk)
    {
        lc.Add(p);
    }
    //lc.AddRange(kkk.ToList());

    var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase);
    Debug.WriteLine(t.Count()); //Prints 1 -- RIGHT
    var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase);
    Debug.WriteLine(tt.Count()); //Prints 0 -- WRONG!!!

AddRangeを試しましたが、それも機能しませんでした。私が気付いたもう1つのことは、「文字列a」割り当てでAIDとBIDのシーケンスを変更した場合、intersectはBIDを検出しますが、AIDは検出しません。理由がわかりませんか?

上記のルーチンのハードコードされたバージョンは正常に機能します

        List<string> la = new List<string>(); la.Add("AID"); la.Add("BID");
        List<string> lb = new List<string>(); lb.Add("[vs"); lb.Add("AID"); lb.Add("1365]");
        List<string> lc = new List<string>(); lc.Add("[vs"); lc.Add("BID"); lc.Add("1365]");
        var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase);
        Debug.WriteLine(t.Count()); //Prints 1.
        var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase);
        Debug.WriteLine(tt.Count());//Prints 1.

更新:以下は私が最終的に作成したコードです。

    string a = "AID, BID";
    string b = "[vs|AID|1365]";
    string c = "[vs|BID|1365]";

    List<string> tla = a.Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();
    List<string> tlb = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();
    List<string> tlc = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
                        .Select(s => s.Trim()).ToList();

    var t = tla.Intersect(tlb, StringComparer.InvariantCultureIgnoreCase);
    var tt = tla.Intersect(tlc, StringComparer.InvariantCultureIgnoreCase);
4

1 に答える 1

3

もしかして

string[] k = a.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

?ソース文字列にスペースがあるため:

string a = "AID, BID";

ちなみに、これは次のように書くことができます

var la = a.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lb = b.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var lc = c.Split("|".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

var t = la.Intersect(lb, StringComparer.InvariantCultureIgnoreCase).ToList();
var tt = la.Intersect(lc, StringComparer.InvariantCultureIgnoreCase).ToList();

IntersectLINQにもメソッドがあるため、中間リストは必要ありません。
ただし、結果をキャッシュする価値があるToListため、最終的なアイテムを呼び出す必要があります。

于 2012-12-21T21:40:47.160 に答える