0

2次元リストを作成しましたが、最大値、最小値、およびこれらの値と同じインデックスを持つ名前を返したいと思います。

これは私がしたことです。

class Info
{
    private string stad;
    private double temperatur;

    public string Stad
    {
        get { return stad; }
        set { stad = value; }
    }

    public double Temperatur
    {
        get { return temperatur; }
        set { temperatur = value; }
    }
}

    static double SearchMax(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        double Temperatur = double.MinValue;
        foreach (Info temperatur in list)
        {
            if (temperatur.Temperatur > Temperatur)
            {
                Temperatur = temperatur.Temperatur;
            }        
        }
        return Temperatur;
    }

    static double SearchMin(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        double Tempertatur = double.MaxValue;
        foreach (Info temperatur in list)
        {
            if (temperatur.Temperatur < Tempertatur)
            {
                Tempertatur = temperatur.Temperatur;
            }
        }
        return Tempertatur;
    }

しかし、私が返すのは最大値と最小値だけであり、気温が含まれている都市の名前ではありません。

誰かが私に教えたり、両方を返す方法を教えてもらえますか?

あなたが提供するすべての助けに感謝します、しかしそれは私がこれをここに投稿する前に私がいたところに戻っただけです。私が欲しいのは、プログラムが都市と都市の気温の両方を返すことです。つまり、「最も暖かい都市はオスロであり、20°C暖かい」であり、「最も暖かい都市はconsoleaplication.info」ではありません。

編集:2すべてのあなたの助けと特にアレックスに感謝します^ _ ^

4

5 に答える 5

2

非常にコンパクトだが非効率的な LINQ ソリューション:

static Info SearchMin(List<Info> list)
{
     return data.OrderBy(i => i.Temperatur).First();
}

ただし、独自のコードを変更したい場合があります。

static Info SearchMin(List<Info> list)
{
    if (list.Count == 0)
    {
        throw new InvalidOperationException("Tomt Lista");
    }
    double Tempertatur = double.MaxValue;
    Info result = null;

    foreach (Info temperatur in list)
    {
        if (temperatur.Temperatur < Tempertatur)
        {
            Tempertatur = temperatur.Temperatur;
            result = temperatur;
        }
    }
    return result;
}

ご覧のとおり、要点はInfoではなくを返すことdoubleです。

于 2013-01-17T21:06:24.000 に答える
2

これを行うには、MoreLinq のMaxByメソッドとMinByメソッドを使用できます。

public static partial class MoreEnumerable
{
    public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector)
    {
        return source.MaxBy(selector, Comparer<TKey>.Default);
    }

    public static TSource MaxBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector, IComparer<TKey> comparer)
    {
        using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
        {
            if (!sourceIterator.MoveNext())
            {
                throw new InvalidOperationException("Sequence was empty");
            }
            TSource max = sourceIterator.Current;
            TKey maxKey = selector(max);
            while (sourceIterator.MoveNext())
            {
                TSource candidate = sourceIterator.Current;
                TKey candidateProjected = selector(candidate);
                if (comparer.Compare(candidateProjected, maxKey) > 0)
                {
                    max = candidate;
                    maxKey = candidateProjected;
                }
            }
            return max;
        }
    }
    public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector)
    {
        return source.MinBy(selector, Comparer<TKey>.Default);
    }

    public static TSource MinBy<TSource, TKey>(this IEnumerable<TSource> source,
        Func<TSource, TKey> selector, IComparer<TKey> comparer)
    {
        using (IEnumerator<TSource> sourceIterator = source.GetEnumerator())
        {
            if (!sourceIterator.MoveNext())
            {
                throw new InvalidOperationException("Sequence was empty");
            }
            TSource min = sourceIterator.Current;
            TKey minKey = selector(min);
            while (sourceIterator.MoveNext())
            {
                TSource candidate = sourceIterator.Current;
                TKey candidateProjected = selector(candidate);
                if (comparer.Compare(candidateProjected, minKey) < 0)
                {
                    min = candidate;
                    minKey = candidateProjected;
                }
            }
            return min;
        }
    }
}

(コメントと引数の null チェックを削除するために編集されました。)

それができたら、それはかなり簡単です:

Info maxInfo = list.MaxBy(item => item.Temperatur);
Info minInfo = list.MinBy(item => item.Temperatur);
于 2013-01-17T21:06:42.667 に答える
0
private static TempratureInfo FindHighestTemprature(IList<TempratureInfo> tempratures)
{
    if(tempratures.Count == 0)
        throw new InvalidOperationException("tempratures");

    return tempratures.OrderByDescending(t => t.Temprature)
                      .First();
}

private static TempratureInfo FindLowestTemprature(IList<TempratureInfo> tempratures)
{
    if (tempratures.Count == 0)
        throw new InvalidOperationException("tempratures");

    return tempratures.OrderBy(t => t.Temprature)
                      .First();
}

Infoクラスを修正してオーバーライドすることができますToString。これにより、文字列が予期されている場合、引数の受け渡し、変数の割り当てなど、上記の関数のいずれかを呼び出すと、フォーマットされた文字列が返されます。

internal class TempratureInfo
{
    public string Name { get; set; }
    public double Temprature { get; set; }

    public override string ToString()
    {
        return string.Format("Temprature in {0} is currently {1}", Name, Temprature);
    }
}

実装例:

private static void Main(string[] args)
    {
        List<TempratureInfo> unitedKingdomTempratures = new List<TempratureInfo>()
            {
                {new TempratureInfo() { Name = "Wales", Temprature = 10.0}},
                {new TempratureInfo() { Name = "England", Temprature = 55.0}},
                {new TempratureInfo() { Name = "Scotland", Temprature = 22.0}},
                {new TempratureInfo() { Name = "Northen Ireland", Temprature = 4.0}}
            };

        Console.WriteLine("Hottest: " + FindHighestTemprature(unitedKingdomTempratures).Name);
        Console.WriteLine("Coldest: " + FindLowestTemprature(unitedKingdomTempratures).Name);

        Console.ReadLine();
    }
于 2013-01-17T21:20:38.333 に答える
0

確かに、これを少し調整して短くすることができます。

var maxtemp = list.Max(x => x.Temperatur);
var maxstad = list.First(x => x.Temperatur == maxtemp).Stad;

var mintemp = list.Min(x => x.Temperatur);
var minstad = list.First(x => x.Temperatur == mintemp).Stad;
于 2013-01-17T21:06:12.847 に答える
0

で注文してTemperatur、最初のものを取ることができます。

これは、大きなリストでは遅くなる可能性があります

    static Info SearchMax(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
        return list.OrderByDescending(i => i.Temperatur).FirstOrDefault();
    }

    static Info SearchMin(List<Info> list)
    {
        if (list.Count == 0)
        {
            throw new InvalidOperationException("Tomt Lista");
        }
         return list.OrderBy(i => i.Temperatur).FirstOrDefault();;
    }
于 2013-01-17T21:08:15.690 に答える