42

私は2つのリストを持っています

List<Sent> SentList;
List<Messages> MsgList;

どちらもMsgIDと呼ばれる同じプロパティを持っています。

MsgList            SentList  

MsgID Content      MsgID Content Stauts
1       aaa        1       aaa     0
2       bbb        3       ccc     0
3       ccc        
4       ddd
5       eee

MsglistのMsgIDをsentlistと比較したいのですが、linqを使用して送信済みリストにないアイテムが必要です

Result 

MsgID Content
2       bbb
4       ddd
5       eee
4

10 に答える 10

52

次のようなことができます:

HashSet<int> sentIDs = new HashSet<int>(SentList.Select(s => s.MsgID));

var results = MsgList.Where(m => !sentIDs.Contains(m.MsgID));

MsgListこれにより、 に一致する ID がないすべてのメッセージが返されSentListます。

于 2012-08-14T17:36:17.473 に答える
29

単純なアプローチ:

MsgList.Where(x => !SentList.Any(y => y.MsgID == x.MsgID))

これは、すべての入力をそれぞれの入力m*nと比較するため、操作に最大でかかることに注意してください(「最大」と、たまたま一致すると短絡するためです)。MsgIDSentListMsgList

于 2012-08-14T17:36:02.047 に答える
17

まあ、あなたはすでに良い答えを持っていますが、それらはほとんど Lambda です。よりLINQのアプローチは次のようになります

var NotSentMessages =
                from msg in MsgList
                where !SentList.Any(x => x.MsgID == msg.MsgID)
                select msg;
于 2012-08-14T17:52:14.233 に答える
8

次のようなことができます

var notSent = MsgSent.Except(MsgList, MsgIdEqualityComparer);

MSDN で概説されているように、カスタム等値比較器を提供する必要があります

http://msdn.microsoft.com/en-us/library/bb336390.aspx

それぞれのタイプの MsgID プロパティに対してのみ、その等値比較器の基本等値を設定するだけです。等値比較子は同じ型の 2 つのインスタンスを比較するため、 MsgIDプロパティを持つSentMessagesの両方が実装するインターフェイスまたは共通の基本型を定義する必要があります。

于 2012-08-14T17:36:33.093 に答える
2

試す、

  public class Sent
{
    public int MsgID;
    public string Content;
    public int Status;

}

public class Messages
{
    public int MsgID;
    public string Content;
}

  List<Sent> SentList = new List<Sent>() { new Sent() { MsgID = 1, Content = "aaa", Status = 0 }, new Sent() { MsgID = 3, Content = "ccc", Status = 0 } };
            List<Messages> MsgList = new List<Messages>() { new Messages() { MsgID = 1, Content = "aaa" }, new Messages() { MsgID = 2, Content = "bbb" }, new Messages() { MsgID = 3, Content = "ccc" }, new Messages() { MsgID = 4, Content = "ddd" }, new Messages() { MsgID = 5, Content = "eee" }};

            int [] sentMsgIDs = SentList.Select(v => v.MsgID).ToArray();
            List<Messages> result1 = MsgList.Where(o => !sentMsgIDs.Contains(o.MsgID)).ToList<Messages>();

それが役立つことを願っています。

于 2012-09-09T12:19:30.690 に答える
0

2番目のリストからリストのアイテムを選択したい場合:

MainList.Where(p => 2ndlist.Contains(p.columns from MainList )).ToList();

于 2020-12-01T07:01:53.667 に答える
-1
List<Car> cars = new List<Car>() {  new Car() { Name = "Ford", Year = 1892, Website = "www.ford.us" }, 
                                    new Car() { Name = "Jaguar", Year = 1892, Website = "www.jaguar.co.uk" }, 
                                    new Car() { Name = "Honda", Year = 1892, Website = "www.honda.jp"} };

List<Factory> factories = new List<Factory>() {     new Factory() { Name = "Ferrari", Website = "www.ferrari.it" }, 
                                                    new Factory() { Name = "Jaguar", Website = "www.jaguar.co.uk" }, 
                                                    new Factory() { Name = "BMW", Website = "www.bmw.de"} };

foreach (Car car in cars.Where(c => !factories.Any(f => f.Name == c.Name))) {
    lblDebug.Text += car.Name;
}
于 2012-08-14T17:44:06.293 に答える