0

そんなに難しいことではないと思いますが、脳が溶けてしまうような問題に取り組んでいます。私の例は長いので、質問を短くしようと思います!

配列でもあるいくつかの要素を含むArrayオブジェクトがあります。例えば:

customerAddresses = new customer_address[]
{
  new    // address #1
  {
    customer_id = 6676979,
    customer_address_seq = 1,
    customer_address_match_codes = new []
    {
      new
      {
        customer_address_seq = 1,
        customer_id = 6676979,
        customer_match_code_id = 5
      }
    }
  },
  new    // address #2
  {
    customer_id = 6677070,
    customer_address_seq = 1,
    customer_address_match_codes = new []
    {
      new
      {
        customer_address_seq = 1,
        customer_id = 6677070,
        customer_match_code_id = 4
      },
      new
      {
        customer_address_seq = 1,
        customer_id = 6677070,
        customer_match_code_id = 5
      },
      new
      {
        customer_address_seq = 1,
        customer_id = 6677070,
        customer_match_code_id = 3
      }
    }
  },
  new    // address #3
  {
    customer_id = 6677070,
    customer_address_seq = 2,
    customer_address_match_code = new []
    {
      new
      {
        customer_address_seq = 2,
        customer_id = 6677070,
        customer_match_code_id = 4
      },
      new
      {
        customer_address_seq = 2,
        customer_id = 6677070,
        customer_match_code_id = 5
      }
    }
  }
};

ご覧のとおり、配列には多数のアドレスレコードが含まれており、との組み合わせごとに1つのレコードがcustomer_idありcustomer_address_seqます。私がやろうとしているのはcustomer_address、次のルールに従って最適なものを見つけることです。

  • 4に等しくなければcustomer_match_code_idならず、5に等しいものがなければなりません
  • customer_match_code_id3に等しい場合はcustomer_address、より強い一致と見なします。

上記のルールによると、2番目のcustomer_address要素は「ベストマッチ」です。ただし、この問題の最後の複雑さは、複数の「ベストマッチ」が存在する可能性があることです。その状況に対処する必要があるのは、最小値と最小値でcustomer_addressレコードを取得することです。customer_idcustomer_address_seq

LINQを使用するのが最善の策だと思っていましたが、十分な経験がないため、ホイールを回し続けています。

4

4 に答える 4

0

Not tested and not the same names but this should get you going

            customer cb = null;
            customer[] cs = new customer[] {new customer()};

            foreach (customer c in cs.OrderBy(x => x.id).ThenBy(y => y.seq))
            {
                if(c.addrs.Any(x => x.num == "5"))
                {
                    if(c.addrs.Any(x => x.num == "3"))
                    {
                        if (cb == null) cb = c;
                        if (c.addrs.Any(x => x.num == "2"))
                        {
                            cb = c;
                            break;
                        }
                    }
                }
            }
于 2012-07-11T22:36:47.173 に答える
0

これはLINQの仕事のように聞こえます

var bestMatch = (from address in DATA
where address.customer_address_match_code.Any(
  x => x.customer_match_code_id == 4)
where address.customer_address_match_code.Any(
  x => x.customer_match_code_id == 5)
select address).OrderBy(
  x => x.customer_address_match_code.Where(
    y => y.customer_match_code_id >= 3)
  .OrderBy(y => y.customer_match_code_id)
  .First()
  .customer_match_code_id).FirstOrDefault();

私の理論は次のとおりです。customer_match_code_id==4とcustomer_match_code_id==5の両方を持つアドレスを選択します。次に、少なくとも3である最も低いcustomer_match_code_idで並べ替えてから、最初のアドレスを取得します。3に等しいcustomer_match_code_idがある場合は、その1つが選択され、そうでない場合は、他のいくつかが選択されます。4と5の両方に一致するものがない場合は、nullが返されます。

テストされていません。

于 2012-07-11T23:25:20.987 に答える
0

LINQでは非常に簡単なようです。

var query =
    from ca in customerAddresses
    where ca.customer_address_match_codes.Any(
        mc => mc.customer_match_code_id == 4)
    where ca.customer_address_match_codes.Any(
        mc => mc.customer_match_code_id == 5)
    orderby ca.customer_id
    orderby ca.customer_address_seq
    orderby ca.customer_address_match_codes.Any(
        mc => mc.customer_match_code_id == 3) descending
    select ca;

var result = query.Take(1);

それはどのように見えますか?

于 2012-07-12T00:13:22.070 に答える
0

1つのコレクションを実際に何かに割り当てるように、クラスに変更を加える必要がありました。

customer_address_match_codes = new customer_address_match_code[]
{
  new
  {
    customer_address_seq = 1,
    customer_id = 6676979,
    customer_match_code_id = 5
  }
}

そして、これが私がテストしたLINQであり、あなたが指定したことを実行します。

var result = (from c in customerAddresses
    let isMatch = c.customer_address_match_codes
                     .Where (cu => cu.customer_match_code_id == 4).Any () &&
                  c.customer_address_match_codes
                     .Where (cu => cu.customer_match_code_id == 5).Any ()
    let betterMatch = isMatch && c.customer_address_match_codes
                  .Where (cu => cu.customer_match_code_id == 3).Any () ? 1 : 0
    where isMatch == true
    orderby betterMatch descending, c.customer_id, c.customer_address_seq
    select c)
    .FirstOrDefault ();

ここで匿名タイプのデータを使用して例を作成しました:http://ideone.com/wyteM

于 2012-07-12T00:13:39.833 に答える