1

別の文字列配列と一致させる必要がある文字列があります。両方の配列値との一致が見つかった場合は、数値を文字列から分割し、その数値に1を追加し、実際の文字列に新しい値を追加する必要があります。いくつかの分割と連結を試みました。しかし、問題を解決するための適切かつ効率的な方法がわかりませんでした。以下は私のシナリオです。

実際の文字列:

BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3,

比較文字列

BK Books      // Compare first two characters => BK Books matches with BK-TS00023
X1 Serials    // Compare first two characters => X1 Serials matches with X1-TS00000101

したがって、これらの文字列との一致が見つかったら、 0002300000101などの数値を取得し、値を 1 増やす必要があります。次に、デフォルトの文字列を追加します。結果の文字列は次のようになります。

結果文字列

'BK-TS00024',
'X1-TS00000102',
'X4-A10000025',
'Y1-4'

以下の方法を試しました。このシナリオを実行する適切な方法を提供するために誰か助けてください。

コード

InfoType="BK Books"; // or "X1 Serials" // or etc ..
var splitInfo = InfoType.Split(' ');
        var SiteFileInfo = Db.SiteFiles.Where(asd => asd.Code == "AutoBarcode").Select(asd => asd.Line1).FirstOrDefault();
        var splitSiteFile = SiteFileInfo.Split(',');
        int cnt = 0;
        foreach (var s in splitSiteFile)
        {
            cnt += 1;
            if (s.Contains(splitInfo[0]))
            {

                //var infoSiteSplit = s.Split('-');
                var olyNumber = Regex.Split(s, @"(?<=\p{L})(?=\p{N})");
                int i = 0;
                string Truncstring = "";
                foreach (var a in olyNumber)
                {
                    bool result = int.TryParse(a, out i);
                    if (result)
                    {
                        i += 1;
                        int befconv = Convert.ToInt32(a);
                        Truncstring = s.Replace(befconv.ToString(), i.ToString());
                    }
                }
                splitSiteFile[cnt - 1] = Truncstring;
                string JoinString = string.Join(",", splitSiteFile);
                Db.ExecuteStoreCommand("update SiteFile set Line1={0} where Code={1}", JoinString, "AutoBarcode");
                Db.SaveChanges();
                return Truncstring;
            }
        }
4

3 に答える 3

1

int を増やした後に文字列の作成を簡素化できる追加のヒントとして、文字列の長さを計算してゼロで PadLeft を実行する代わりに、int を取得して StringFormat IFormatProvider を使用して先行ゼロを追加することもできます。

string paddedString = String.Format("TS{1:00000}", count); 
//when count = 24, should output "TS00024"
于 2013-07-10T12:38:16.403 に答える
1

(およびオプションで、インスタンスRegex.Replace Method (String, String, MatchEvaluator)の代わりにデリゲート) を使用できます。MatchEvaluator

これを試してください(フィルター内のすべての一致が1で増加します):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

class Program
{
    static void Main(string[] args)
    {
        var input = "BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3,";
        var filter = new[] { "BK Books", "X1 Serials" };
        Console.WriteLine(input);
        var result = IncreaseWithFilter(input, filter);
        Console.WriteLine(result);
    }

    private static string IncreaseWithFilter(
        string input,
        IEnumerable<string> filter)
    {
        var truncatedFilter = filter.Select(f => f.Substring(0, 2));
        var result = Regex.Replace(input, @"([^,].*?)\d+(?=,)",
            (match1) =>
            {
                var value = match1.Value;
                if (truncatedFilter.Any(f => match1.Value.StartsWith(f)))
                {
                    value = Regex.Replace(match1.Value, @"(?<=)\d+",
                        (match2) =>
                        {
                            return (Convert.ToInt32(match2.Value) + 1)
                                .ToString()
                                .PadLeft(match2.Value.Length, '0');
                        });
                }
                return value;
            });
        return result;
    }
}

出力:

BK-TS00023,X1-TS00000101,X4-A10000024,Y1-3,
BK-TS00024,X1-TS00000102,X4-A10000024,Y1-3,

コードでの使用例:

InfoType = "BK Books";
var SiteFileInfo = Db.SiteFiles
    .Where(asd => asd.Code == "AutoBarcode")
    .Select(asd => asd.Line1)
    .FirstOrDefault();
var result = IncreaseWithFilter(
    SiteFileInfo, 
    new[] { InfoType });
于 2013-07-10T11:47:58.553 に答える