簡體   English   中英

使用 linq 過濾對象列表

[英]Filter list of objects using linq

我有以下方式的對象

public class dettails
    {
        public string server { get; set; }
        public string details1 { get; set; }
        public string details2 { get; set; }
        public string version    { get; set; }

        public dettails(string Server, string Details1, string Details2, string Version)
        {
            server = Server;
            details1 = Details1;
            details2 = Details2;
            version = Version;
        }
    }

以下是存儲在對象列表中的數據。

Server1, Database, MySQL, 5.5
Server2, Database, MySQL, 5.1
Server3, OS, Ubuntu, 10.04
Server1, OS, Ubuntu, 10.04
Server2, OS, Ubuntu, 12.04
Server3, Language, Python, 2.6.3

數據已經存儲在對象列表中。 我想要的輸出是以下方式

在至少 2 個不同的服務器上安裝過時版本(即不是最新版本的版本)的軟件包名稱列表。

因此,在這種情況下,程序的輸出應該是:

Ubuntu 因為Ubuntu 10.04是過時版本(最新版本是12.04),安裝在兩台服務器上(Server 3,Server 1)。

我如何使用 linq 實現它。 請指教。

您應該有辦法找出每個操作系統的最新版本。 如果沒有這些信息,就很難實現。

我們可以假設我們在任何服務器上找到的最新版本是“最新版本”,但這並不准確。

如果我們有一種生成唯一鍵的方法,讓我們說:

string AssemlbeKey(dettails serverInfo) => $"{serverInfo.details1}, {serverInfo.details2}";

然后我們可以構建一個字典來確定給定集合中任何服務器上安裝的最新版本:

var dictPretendedMostRecentVersionsByDetails = ServerCollection
    .GroupBy(entry => AssembleKey(entry))
    .ToDictionary(
        group => group.Key, 
        group => group.Value
            .OrderByDescending(entry => Version.Parse(entry.version))
            .First()
    );

現在我們已經了解什么是“棄用”,我們可以掃描服務器集合以查找它。

var deprecatedCollection = ServerCollection
    .Select(entry => new KeyValuePair<string, ServerInfo>(AssembleKey(entry), entry)
    .Where(entry => dictPretendedMostRecentVersionsByDetails[entry.Key] < Version.Parse(entry.version))
    .Select(entry => entry.Value);

然后,您應該擁有一組已棄用的服務器詳細信息,現在可以對其進行枚舉並對其執行任何操作(例如,將其與所有必要信息一起寫入控制台)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM