2

entry というオブジェクトがあります。float には min と max があり、string には fileName があります。そして、それらのオブジェクトはリストに保存されます

List<Entry> minMaxList = new List<Entry>();

ファイル名とともに、最大値と最小値を持つオブジェクトを見つける必要があります。

したがって、このような配列がある場合

       Entry1                    Entry2                  Entry3
min  max    filename        min  max    filename      min  max    filename
| 2 | 120 |  file1.txt |  | 2 | 150 |  file1.txt |  | 5 | 150 |  file1.txt |     

最小値のオブジェクトが Entry1 と Entry2 であり、最大値のオブジェクトが Entry2 と Entry3 であることを取得したい

私はこれを試しました:

var max =  minMaxList.Max(r => r.getMax())

これはうまく機能しますが、それがどこから来たのかについての他の情報なしで、単一の値を返します。オブジェクト全体、または少なくともこの値が含まれるファイル名が必要です。単一のコマンドで実行できるのか、それともリストをもう一度繰り返して、以前に選択した最小値と最大値に基づいてすべてのエントリを見つける必要があるのか​​ 疑問に思います。

4

6 に答える 6

3

最大値のみを通過させるのではなく、列挙可能なものをいつでもフィルタリングできます。

var maxvalue = minMaxList.Max(w => w.getMax());
var maxitems = minmaxlist.Where(w => w.getMax() == maxvalue);
于 2015-05-28T13:02:13.377 に答える
1

これを解決する最も効率的な方法について質問しています。

最大値/最小値を決定し、後でそれらの項目を検索するには、リストを 2 回繰り返す必要があります。1回のループで手動で解決します

List<Entry> ResultList = new List<Entry>();
ResultList.Add(minMaxList[0]);
foreach (Entry item in minMaxList)
{
    if (item.getMax() >= ResultList[0].getMax())
    {
        if (item.getMax() != ResultList[0].getMax())
        {
            ResultList.Clear();
        }
        ResultList.Add(item);
    }
}
于 2015-05-28T13:31:32.710 に答える
1

近いです。一致するアイテムを見つけるフィルターを追加するだけです。

var max =  minMaxList.Max(r => r.getMax())

var itemsWithMax = minMaxList.Where(r => r.getMax() == max);

と同様にMin

コマンド一発でできるのかな

おそらく、複雑なグループ化または結合を使用しますが、最初に機能するものを取得してから、それを改善しようとします(単一のクエリが常に複数のクエリよりも「優れている」とは限らないことを思い出してください)。

于 2015-05-28T13:01:50.837 に答える
0

次の方法でグループ化してみてください。

    var grpWithMaxVaues = minMaxList.GroupBy(c => c.getMax())
                                    .OrderByDescending(c => c.Key)
                                    .FirstOrDefault() 

        var max =   grpWithMaxVaues.FirstOrDefault();

Console.WriteLine(max.FileName);
于 2015-05-28T13:04:41.277 に答える
-1

ほら、こんな感じ。

リストの1つの列挙で最小値と最大値を見つけることができます。これは、他の回答のように、リストを数回列挙するよりもおそらく高速です。

これは実際のデモンストレーションです。

単一要素配列を使用して値を格納することに完全に満足しているわけではありませんが、シードの値型のプロパティを変更可能にします。これにより、アグリゲーションを常に再割り当てする必要がなくなります。

var minMaxInfo = minMaxList.Skip(1)
    .Aggregate(
        new
        { 
            Max = new int[] { minMaxList[0].Max },
            MaxIndexes = new List<int> { 0 },
            Min = new int[] { minMaxList[0].Min },
            MinIndexes = new List<int> { 0 },
            Index = new int[] { 0 }
        },
        (r, t) =>
        {
            r.Index[0]++;       
            if (t.Min < r.Min[0])
            {
                r.Min[0] = t.Min;
                r.MinIndexes.Clear();
                r.MinIndexes.Add(r.Index[0]);
            } 
            else if (t.Min == r.Min[0])
            {
                r.MinIndexes.Add(r.Index[0]);   
            }

            if (t.Max > r.Max[0])
            {
                r.Max[0] = t.Max;
                r.MaxIndexes.Clear();
                r.MaxIndexes.Add(r.Index[0]);
            }
            else if (t.Max == r.Max[0])
            {
               r.MaxIndexes.Add(r.Index[0]);
            }

            return r;
        });

許可し、

Console.WriteLine("MaxValue: {0}", minMaxInfo.Max[0]);
Console.WriteLine(
    "MaxFiles: {0}",
    string.Join(
        ", ",
        minMaxInfo.MaxIndexes.Select(i => minMaxList[i].FileName)));
Console.WriteLine("MinValue: {0}", minMaxInfo.Min[0]);
Console.WriteLine(
    "MinFiles: {0}",
    string.Join(
        ", ",
        minMaxInfo.MinIndexes.Select(i => minMaxList[i].FileName)));
于 2015-05-28T13:20:34.523 に答える