0

次のように、データベースから取得している2つのリストがあります。

List<myobject1> frstList = ClientManager.Get_FirstList( PostCode.Text, PhoneNumber.Text);
                List<myobject2> secondList = new List<myobject2>;

                foreach (var c in frstList )
                {
                    secondList.Add( ClaimManager.GetSecondList(c.ID));
                }

今、私のリストには次のようなデータが含まれます:

frstList: id = 1, id = 2
secondList: id=1 parentid = 1, id=2 parentid=1 and id = 3 parentid = 2

これらを個別にカウントし、カウントが最も多いものを返したいですか? 上記の例では、frsList から id=1 を返し、secondList から id1 と id2 を返す必要があります...

これを試しましたが、動作しません

var numbers = (from c in frstList where c.Parent.ID == secondList.Select(cl=> cl.ID) select c).Count();

誰かがこれを行うためにlinqまたは通常のforeachで私を助けてもらえますか?

ありがとう

4

1 に答える 1

1

質問を見ると、どの親ノードが最も多くの子ノードを持っているかを判断する必要があり、その親ノードとそのすべての子ノードを出力する必要があるようです。

クエリはかなり簡単です。

var largestGroup = secondList.GroupBy(item => item.ParentID)
  .MaxBy(group => group.Count());  

var mostFrequentParent = largestGroup.Key;
var childrenOfMostFrequentParent = largestGroup.AsEnumerable();

このヘルパー関数が必要ですMaxBy:

public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source
    , Func<TSource, TKey> selector
    , IComparer<TKey> comparer = null)
{
    if (comparer == null)
    {
        comparer = Comparer<TKey>.Default;
    }
    using (IEnumerator<TSource> iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
        {
            throw new ArgumentException("Source was empty");
        }

        TSource maxItem = iterator.Current;
        TKey maxValue = selector(maxItem);

        while (iterator.MoveNext())
        {
            TKey nextValue = selector(iterator.Current);
            if (comparer.Compare(nextValue, maxValue) > 0)
            {
                maxValue = nextValue;
                maxItem = iterator.Current;
            }
        }
        return maxItem;
    }
}
于 2012-10-26T16:06:43.423 に答える