1

私は2つのリストを持っています、それらはこのように見えます

<List> ads
[0]
Headline = "Sony Ericsson Arc silver"
[1]
Headline = "Sony Ericsson Play R800I"


<List> feedItems
[0]
Headline = "Sony Ericsson Xperia Arc Silver"
[1]
Headline = "Sony Ericsson Xperia Play R800i Black"

少なくとも 2 つの単語で互いに一致する要素を使用して、新しい 3 番目のリストを作成する最も簡単な方法は何ですか? おそらくLINQの方法でこれを達成できますか?

3番目のリストは次のようになります

[0]
AdHeadline = "Sony Ericsson Arc silver"
MatchingFeed  = "Sony Ericsson Xperia Arc Silver"
// etc

最初のリストをトラバースしてRegex.Matchクラスを使用してみました。一致が見つかった場合は、3 番目のリストに入力します。表現に 2 つ以上の単語。

4

3 に答える 3

5

正規表現がここでのパーティーに何かをもたらすかどうかはわかりません。以下はいかがでしょうか?

// Define a helper function to split a string into its words.
Func<string, HashSet<string>> GetWords = s =>
    new HashSet<string>(
        s.Split(new[]{' '}, StringSplitOptions.RemoveEmptyEntries)
        );

// Pair up each string with its words. Materialize the second one as
// we'll be querying it multiple times.
var aPairs = ads.Select(a => new { Full = a, Words = GetWords(a) });
var fPairs = feedItems
                 .Select(f => new { Full = f, Words = GetWords(f) })
                 .ToArray();

// For each ad, select all the feeds that match more than one word.
// Then just select the original ad and feed strings.
var result = aPairs.SelectMany(
    a => fPairs
        .Where(f => a.Words.Intersect(f.Words).Skip(1).Any())
        .Select(f => new { AdHeadline = a.Full, MatchingFeed = f.Full })
    );
于 2012-06-21T09:36:23.283 に答える
1

これを行うには間違いなくより効率的な方法がありますが、ここから始めましょう。

class Program
{
    private static void Main()
    {
        var ads = new[]
        {
            "Sony Ericsson Arc silver",
            "Sony Ericsson Play R800I",
            "Oneword",
        };

        var feedItems = new[]
        {
            "Sony Ericsson Xperia Arc Silver",
            "Nokia Lumia 900",
            "Sony Ericsson Xperia Play R800i Black",
        };

        var results = from ad in ads
                      from feedItem in feedItems
                      where isMatch(ad, feedItem)
                      select new
                      {
                          AdHeadline = ad,
                          MatchingFeed = feedItem,
                      };

        foreach (var result in results)
        {
            Console.WriteLine(
                "AdHeadline = {0}, MatchingFeed = {1}",
                result.AdHeadline,
                result.MatchingFeed
            );
        }
    }

    public static bool isMatch(string ad, string feedItem)
    {
        var manufacturerWords = new[] { "sony", "ericsson", "nokia" };

        ad = ad.ToLower();
        feedItem = feedItem.ToLower();

        var adWords = Regex.Split(ad, @"\W+").Except(manufacturerWords);
        var feedItemWords = Regex.Split(feedItem, @"\W+").Except(manufacturerWords);

        var isMatch = adWords.Count(feedItemWords.Contains) >= 2;
        return isMatch;
    }
}
于 2012-06-21T10:03:16.607 に答える
1

興味深い問題です。この問題にはさまざまな方法で対処できますが、メーカーのリストを作成し、それを使用して入力リストから文字列を削除することをお勧めします。次に、関心のあるすべてのモバイル モデルのルックアップ テーブルを作成し、モデル番号と製造元 (以前に確認したもの) を使用して、そのテーブルで LINQ 選択を実行します。そのため、製造元とモデル番号を特定すると、作業が簡単になる場合があります。

個人的には正規表現を使用しませんが、リストの作成に使用できる汎用電話モデル クラスを作成します。また、電話データを手動で入力する場合は、レーベンシュタイン アルゴリズムの使用を検討してください。

于 2012-06-21T09:35:54.020 に答える