1

一見単純な問題: 文字列のリストがあります (プロパティ ファイルから読み取られます):

IList<string> defaultValues = new List<string> {"0458","0309"};

それぞれが文字列型のプロパティを持ついくつかのオブジェクトの別のリスト:

IList<Token> tokens = new List<Token>
{
    new Token {DisplayValue = "0123"},
    new Token {DisplayValue = "0309"},
    new Token {DisplayValue = "0203"},
    new Token {DisplayValue = "0458"},
    new Token {DisplayValue = "0911"}
};

public class Token
{
   public string DisplayValue { get; set; }
}

ここで、DisplayValue が defaultValues (0485) の最初の要素と一致する token の要素を取得したいと思います。DisplayValue が 0485 の要素が見つからない場合は、defaultvalues の 2 番目の要素が (0309) などと一致する必要があります。

defaultValues リストは動的にすることができるため、より多くの値を追加でき、常に最初のエントリが優先されます。

したがって、defaultValues リストは文字列の優先度リストのようなもので、インデックスが低いほど優先度が高くなります。上記の例では、結果は「0458」になります。

私はこのようなことができます:

string result = string.Empty;

foreach (var searchValue in defaultValues)
{
    if (tokens.Any(token => token.DisplayValue == searchValue))
    {
        result = searchValue;
    }   
}

しかし、このようなことは、よりエレガントに foreach なしで行うことができると思います...

4

2 に答える 2

2

この場合、 UsingAnyは O(n^2) であり、おそらく最もパフォーマンスが高くありません。おそらくこれを行う最善の方法は、GroupJoin(代わりに O(n) にする) を実行し、一致した最初のトークンを選択することです。完全に一致するキーに対してのみ実行されることに注意してGroupJoinください。したがって、比較または部分文字列検索を探している場合は、他の方法を見つける必要があります。

defaultValues
    .GroupJoin(
        tokens, // matching 0:n tokens per default value
        defVals => defVals, // key selector for our left source
        tks => tks.DisplayValue, // key selector for our right source
        (defVal, tks) => tks.FirstOrDefault()) // result selector for our matches
    .FirstOrDefault(match => match != null)

これには、各コレクションを 1 回だけトラバースし、すべてのトークンを対応するものと照合するという利点がありDefaultValueます (したがって、デフォルト値ごとに複数の一致を行うことができます)。できますが、同じ問題に遭遇しdefaultValues.FirstOrDefault(x => tokens.Any(t => t == x))ます (O(n^2) の複雑さの可能性があります)。ここから、それが null かどうかを確認し (null 合体を使用) Empty、 Token に初期化される Token で呼び出される静的定数を追加できますnew Token { DisplayValue = string.Empty }。その後、これを行うことができます:

(defaultValues
    .GroupJoin(
        ...
    .FirstOrDefault(match => match != null) ?? Token.Empty).DisplayValue
于 2012-12-19T21:37:17.617 に答える
0

基本的に、Linq/Lambada の結果から射影を探す必要があります。

私はこのようなことを試してみます:

var macthes = tokens.Any(t => t.DisplayValue.In(defaultValues))
              .Select(y =>y.DisplayValue);
于 2012-12-19T20:52:01.643 に答える