我有 2 個 c# 類 -
class ABC
{
string LogId;
string Name;
}
class XYZ
{
string LogId;
string Name;
}
class Checker
{
public void comparelists()
{
List<ABC> lstABC =new List<ABC>();
lstABC.Add(new ABC...);
lstABC.Add(new ABC...);
lstABC.Add(new ABC...);
List<XYZ> lstXYZ =new List<XYZ>();
lstXYZ.Add(new XYZ...);
lstXYZ.Add(new XYZ...);
lstXYZ.Add(new XYZ...);
var commonLogId = lstABC
.Where(x => lstXYZ.All(y => y.LogId.Contains(x.LogId)))
.ToList();
}
}
從代碼中可以看出,我想從 lstABC 中獲取 lstXYZ 中存在的所有 logid。
例如。lstABC 有 ->
LogId="1", Name="somename1"
LogId="2", Name="somename2"
LogId="3", Name="somename3"
LogId="4", Name="somename4"
LogId="5", Name="somename5"
lstXYZ 有 ->
LogId="1", Name="somename11"
LogId="2", Name="somename22"
LogId="3", Name="somename33"
LogId="8", Name="somename8"
LogId="9", Name="somename9"
那么 lstABC 中存在于 lstXYZ 中的所有 logid 是 - 1,2,3 ;所以所有這些記錄都應該被獲取。
但是在下面的 linq 查詢中 -
var commonLogId = lstABC
.Where(x => lstXYZ.All(y => y.LogId.Contains(x.LogId)))
.ToList();
正在獲取/選擇 0 條記錄。
uj5u.com熱心網友回復:
與 Any()
var res = lstABC.Where(x => (lstXYZ.Any(y => y.LogId == x.LogId))).Select(x => x.LogId);
https://dotnetfiddle.net/jRnUwS
另一種方法Intersect()對我來說感覺更自然一些
var res = lstABC.Select(x => x.LogId).Intersect(lstXYZ.Select(y => y.LogId));
https://dotnetfiddle.net/7iWYDO
uj5u.com熱心網友回復:
您使用了錯誤的 LINQ 函式。嘗試Any():
var commonLogId = lstABC
.Where(x => lstXYZ.Any(y => y.LogId == x.LogId))
.ToList();
還要注意 id 比較Contains()是錯誤的。換用就好了==。
All()檢查串列中的所有元素是否滿足指定條件。Any()另一方面只檢查是否至少有一個元素。
請注意,當兩個串列都很大時,您的實作將非常緩慢,因為它的運行時復雜性隨著要比較的元素數量成二次方增長。一個更快的實作將使用Join()正是為此目的而創建和優化的:
var commonLogIds = lstABC
.Join(
lstXYZ,
x => x.LogId, // Defines what to use as key in `lstABC`.
y => y.LogId, // Defines what to use as key in `lstXYZ`.
(x, y) => x) // Defines the output of matched pairs. Here
// we simply use the values of `lstABC`.
.ToList();
uj5u.com熱心網友回復:
將完全不同的型別相交似乎很不自然,所以我很想連接共性并撰寫一個 EqualityComparer:
class ABC : ILogIdProvider
{
public string LogId {get;set;}
public string Name;
}
class XYZ : ILogIdProvider
{
public string LogId{get;set;}
public string Name;
}
interface ILogIdProvider
{
string LogId{get;}
}
class LogIdComparer : EqualityComparer<ILogIdProvider>
{
public override int GetHashCode(ILogIdProvider obj) => obj.LogId.GetHashCode();
public override bool Equals(ILogIdProvider x, ILogIdProvider y) => x.LogId == y.LogId;
}
然后你可以Intersect更自然地列出串列:
var res = lstABC.Intersect(lstXYZ, new LogIdComparer());
實體:https : //dotnetfiddle.net/0Tt6eu
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/369448.html
